我正在尝试在keras(Tensorflow Backend)中创建一个损失函数,但我有点卡住检查自定义丢失函数的内部。实际上,只有在我编译模型时才会在控制台上显示打印件,之后没有打印件。 (我只是测试非常简单的自定义函数,当我解决这个问题时,我将创建真正的函数)。我使用train_on_batch函数训练模型。我该如何解决这个问题?
def loss_yolo(self, y_true, y_pred):
'''
4*7*7 = 196
1*7*7 = 49
7*7*20 = 980
'''
print('inside loss function')
loss = K.mean(y_true- y_pred)
return loss
model.compile(optimizer='sgd', loss=loss_yolo)
print('train on batch')
print(model.train_on_batch(x, y))
我的输出:
内部损失功能
批量训练
-0.481604
答案 0 :(得分:4)
你唯一能做的就是不使用python的打印功能,但是例如,tensorflow的tf.Print函数是计算图的一部分。文档说操作什么都不做,但每次评估它都会打印一条你可以指定的消息。
您只需要小心将其正确放置在图表中,例如:
def loss(y_true, y_pred):
d = y_true - y_pred
d = tf.Print(d, [d], "Inside loss function")
return tf.reduce_mean(tf.square(d))
更好地了解内部发生的事情是使用tensorflow debugger。
答案 1 :(得分:2)
我添加了 output_stream 参数并在 TensorFlow v2.4.1 中尝试了此代码。工作正常:
def loss_custom(y_true, y_pred):
d = y_true - y_pred
tf.print("\n y_true:", type(y_true), output_stream=sys.stdout)
return tf.reduce_mean(tf.square(d))
训练期间的输出:
Epoch 1/10
y_true: <class 'tensorflow.python.framework.ops.Tensor'>
1/72 [..............................] - ETA: 0s - loss: 0.2328 - accuracy: 0.3319
y_true: <class 'tensorflow.python.framework.ops.Tensor'>
2/72 [..............................] - ETA: 9s - loss: 0.2087 - accuracy: 0.5250
y_true: <class 'tensorflow.python.framework.ops.Tensor'>