Keras没有提高Tensorflow错误?

时间:2018-05-17 00:01:59

标签: tensorflow keras

我正在为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。为什么不呢?

(或者,调试我的自定义丢失函数的更合理的方法是什么?)

2 个答案:

答案 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)