Python 警告“在tf.keras中使用tensorflow急切执行时尝试解除分配nullptr”

Python 警告“在tf.keras中使用tensorflow急切执行时尝试解除分配nullptr”,python,tensorflow,keras,eager-execution,Python,Tensorflow,Keras,Eager Execution,根据tensorflow团队的建议,我已经习惯了tensorflow对tf.keras的热切执行。但是,每当我训练一个模型时,我都会收到一个警告(编辑:实际上,我会收到重复多次的警告,每个训练步骤不止一次,淹没了我的标准输出): E tensorflow/core/common_runtime/bfc_allocator.cc:373]试图取消分配nullptr 这个警告似乎并不影响训练的质量,但我想知道这意味着什么,是否有可能摆脱它 我使用一个conda虚拟环境,在CPU上运行python 3

根据tensorflow团队的建议,我已经习惯了tensorflow对tf.keras的热切执行。但是,每当我训练一个模型时,我都会收到一个警告(编辑:实际上,我会收到重复多次的警告,每个训练步骤不止一次,淹没了我的标准输出):

E tensorflow/core/common_runtime/bfc_allocator.cc:373]试图取消分配nullptr

这个警告似乎并不影响训练的质量,但我想知道这意味着什么,是否有可能摆脱它

我使用一个conda虚拟环境,在CPU上运行python 3.7和tensorflow 1.12。(编辑:使用Python3.6进行的测试给出了相同的结果。)下面是复制警告的最小代码。有趣的是,可以对tf.enable_eager_execution()行进行注释,并看到警告消失

import numpy as np
import tensorflow as tf

tf.enable_eager_execution()
N_EPOCHS = 50
N_TRN = 10000
N_VLD = 1000

# the label is positive if the input is a number larger than 0.5
# a little noise is added, just for fun
x_trn = np.random.random(N_TRN)
x_vld = np.random.random(N_VLD)
y_trn = ((x_trn + np.random.random(N_TRN) * 0.02) > 0.5).astype(float)
y_vld = ((x_vld + np.random.random(N_VLD) * 0.02) > 0.5).astype(float)

# a simple logistic regression
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1, input_dim=1))
model.add(tf.keras.layers.Activation('sigmoid'))

model.compile(
    optimizer=tf.train.AdamOptimizer(),
    # optimizer=tf.keras.optimizers.Adam(),  # doesn't work at all with tf eager execution
    loss='binary_crossentropy',
    metrics=['accuracy']
)

# Train model on dataset
model.fit(
    x_trn, y_trn,
    epochs=N_EPOCHS,
    validation_data=(x_vld, y_vld),
)
model.summary()

快速解决方案:

  • 当我在TF1.11中运行相同的脚本时,它没有出现,而优化是为了在合成数据集上达到相同的最终验证精度

  • 使用本机操作系统模块(改编自)抑制错误/警告。ie;通过将Tensorflow日志记录环境变量设置为不显示任何错误消息

      import os
      os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
      import tensorflow as tf
    
更多信息:

  • 以正确的方式解决此错误可能需要熟悉MKL库调用及其在用C编写的Tensorflow上的接口(这超出了我目前的TF专业知识)

  • 在我的例子中,每当 调用了优化器的apply_gradients()方法。在脚本中,将模型拟合到训练数据时调用它

  • 此错误由此引发:


为了方便起见,我希望这能作为一个临时解决方案有所帮助。

试着检查一下:TensorFlow需要Python 3.4、3.5或3.6 Hi,我检查了Python版本,有趣的是,它说的是3.6.8。感觉就像tensorflow在安装时悄悄地更改了主解释器版本。无论如何,我尝试了一个全新的3.6康达环境,但问题仍然存在。