我正在为Keras编写一个自定义Tensorflow丢失函数,我尝试使用Tensorflow断言进行调试,但是即使我确定应该这样做,这些也不会引起任何错误。我可以将其归结为以下示例:
from keras.models import Sequential
from keras.layers import Dense
import tensorflow as tf
import numpy as np
def demo_loss(y_true, y_pred):
tf.assert_negative(tf.ones([1,1]))
return tf.square(y_true - y_pred)
model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))
model.compile(optimizer='rmsprop', loss=demo_loss)
model.fit(np.ones((1000,1)), np.ones((1000,1)), epochs=10, batch_size=100)
在我看来,这应该会发出InvalidArgumentError
。为什么不呢?
(或者,调试我的自定义丢失函数的更合理的方法是什么?)
答案 0 :(得分:0)
我不确定代码是否应该停止...您的损失函数将与您的模型一起编译在一个图形中,并且tf.assert
命令与所有内容完全断开。
这些功能无意调试。创建它们是为了实现最高性能,这就是为什么它首先作为图表制作,然后才提供数据。
当我想调试时,我会选择一个小模型并预测:
trueInput = Input(outputShape)
predInput = Input(outputShape)
output = Lambda(lambda x: demo_loss(x[0],x[1]))([trueInput,predInput])
debugModel = Model([trueInput,predInput], output)
现在使用此模型进行预测:
retults = degugModel.predict([someNumpyTrue, someNumpyPred])
您可以将函数划分为较小的函数,每个函数在不同的Lambda图层中,并分别查看每个输出。
答案 1 :(得分:0)
您的TensorFlow代码无法正常工作,因为没有任何内容可以强制执行断言。要使其工作,您需要为其添加控件依赖项,例如:
def demo_loss(y_true, y_pred):
with tf.control_dependencies([tf.assert_negative(tf.ones([1,1]))]):
return tf.square(y_true - y_pred)