在Keras中调用model.fit时无法从损失函数运行打印语句

时间:2018-08-23 20:11:33

标签: python tensorflow neural-network keras

我创建了一个自定义损失函数

def customLoss(true, pred) //do_stuff //print(variables) return loss

现在我称编译为model.compile(optimizer='Adamax', loss = customLoss)

编辑:我尝试了tf.Print,这是我的结果。

    def customLoss(params):

        def lossFunc(true, pred):
            true = tf.Print(true, [true.shape],'loss-func') #obviously this won't work because the tensors aren't the same shape; however, this is what I want to do.
            #stuff
            return loss
        return lossFunc

    model = Model(inputs=[inputs], outputs=[outputs])
    parallel_model = multi_gpu_model(model, gpus=8)
    parallel_model.compile(opimizer='Adam', loss = customLoss(params), metrics = [mean_iou)
    history = parallel_model.fit(X_train, Y_train, validation_split=0.25, batch_size = 32, verbose=1)

,输出为

Epoch 1/10
1159/1159 [==============================] - 75s 65ms/step - loss: 0.1051 - mean_iou: 0.4942 - val_loss: 0.0924 - val_mean_iou: 0.6933
Epoch 2/10
1152/1159 [============================>.] - ETA: 0s - loss: 0.0408 - mean_iou: 0.7608

打印语句仍然不打印。我是否缺少某些内容-我对tf.Print的输入是否不合适?

1 个答案:

答案 0 :(得分:1)

这不是因为Keras会丢弃缓冲区或执行魔术,而是根本不调用它们!调用一次损失函数以构建计算图,然后返回表示损失值的符号张量。 Tensorflow使用它来计算损耗,梯度等。

您可能会反而对tf.Print感兴趣,因为它是空操作,具有打印输出的参数的副作用。由于tf.Print是计算图的一部分,因此也会在训练时运行。从文档中:

  

打印张量列表。   这是一个身份操作(行为类似tf.identity),具有评估时打印数据的副作用。