使用Keras / TF在jupyter笔记本自定义丢失功能内打印

时间:2018-06-02 20:09:32

标签: python tensorflow keras jupyter-notebook loss-function

在Keras中,如果您在Jupyter笔记本中制作自定义丢失功能,则无法打印任何内容。例如,如果你有:

def loss_func(true_label, NN_output):
        true_cat = true_label[:,0]
        pred_cat = NN_output[:,0]
        indicator = NN_output[:,1]
        print("Hi!")
        custom_term = K.mean(K.abs(indicator))
        return binary_crossentropy(true_cat, pred_cat) + custom_term

评估功能时不会打印任何内容。

作为一种解决方法,如果我正在进行一些调试,我发现我可以在一个成本函数中写入一个文件,如果我想打印像int或string这样的标准,这可能很有用。

但是,尝试将indicator这样的张量写入文件会给带来令人难以置信的帮助输出:

Tensor("loss_103/model_105_loss/Print:0", shape=(512,), dtype=float32)

我知道TF提供了tf.Print()方法来打印张量的值,但我不明白它与Jupyter的关系。其他答案都说tf.Print()写给标准。错误,这意味着尝试

sys.stderr = open('test.txt', 'w')

理论上应该允许我从文件中获取输出,但不幸的是,这不起作用(至少在Jupyter中)。

是否有任何通用方法可以将张量表示为字符串?人们通常如何绕过这个障碍来查看代码的作用?如果我想出一些比寻找平均值更奇特的东西,我想知道在我的计算步骤中究竟发生了什么,以验证它是否按预期工作。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以执行以下代码:

def loss_func(true_label, NN_output):
    true_cat = true_label[:,0]
    true_cat = tf.Print(true_cat, [true_cat], message="true_cat: ") # added line
    pred_cat = NN_output[:,0]
    pred_cat = tf.Print(pred_cat, [pred_cat], message="pred_cat: ") # added line
    indicator = NN_output[:,1]
    custom_term = K.mean(K.abs(indicator))
    return binary_crossentropy(true_cat, pred_cat) + custom_term

基本上,我添加了两行来打印true_cat和pred_cat的值。 要打印某些内容,必须在上述语句的tf图中包含print语句。
但是,诀窍是它将在jupyter笔记本控制台上打印,在该控制台上您将运行笔记本,而不是在ipython笔记本上运行。

参考文献:

waitForOrKill

How to print the value of a Tensor object in TensorFlow?

Printing the loss during TensorFlow training