调试keras张量值

ron*_*roo 25 python neural-network keras tensor

我正在实现自己的keras损失功能.如何访问张量值?

我试过的

def loss_fn(y_true, y_pred):
    print y_true
Run Code Online (Sandbox Code Playgroud)

它打印

Tensor("target:0", shape=(?, ?), dtype=float32)
Run Code Online (Sandbox Code Playgroud)

是否有任何keras函数来访问y_true值?

小智 16

Keras的后端print_tensor可以让你做到这一点.你可以这样使用它:

import keras.backend as K

def loss_fn(y_true, y_pred):
    y_true = K.print_tensor(y_true, message='y_true = ')
    y_pred = K.print_tensor(y_pred, message='y_pred = ')
    ...
Run Code Online (Sandbox Code Playgroud)

该函数返回相同的张量.当评估该张量时,它将打印其内容,前面加上message.来自Keras文档:

请注意,print_tensor返回与x相同的新张量,应在以下代码中使用.否则,在评估期间不考虑打印操作.

所以,确保之后使用张量.

  • 这看起来不错,但是更长的张量不会完整打印出来(像这样:softmax = [[0.0599291697 0.0380649045 0.0828271] ...])。您知道一种整体打印它们的方法(或至少控制它们打印多长时间吗?) (2认同)

小智 5

通常,y_true您事先知道 - 在准备您的火车公司...

但是,有一个技巧可以看到里面的值y_true和/或y_pred.Keras让您有机会编写相应的回调以打印神经网络的输出.它看起来像这样:

def loss_fn(y_true, y_pred):
    return y_true # or y_pred
...
import keras.callbacks as cbks
class CustomMetrics(cbks.Callback):

    def on_epoch_end(self, epoch, logs=None):
        for k in logs:
            if k.endswith('loss_fn'):
               print logs[k]
Run Code Online (Sandbox Code Playgroud)

loss_fnmodel.compile(...,metrics=[loss_fn],)在模型编译期间将其传递给函数时的损失函数的名称.

所以,最后,你必须将这个CustomMetrics回调作为参数传递给model.fit():

model.fit(x=train_X, y=train_Y, ... , callbacks=[CustomMetrics()])
Run Code Online (Sandbox Code Playgroud)

PS:如果你在Keras中使用Theano(或TensorFlow),你编写一个python程序,然后编译并执行.因此,在您的示例中y_true- 只是一个张量变量,用于进一步编译和丢失函数计数.

这意味着无法看到其中的值.例如,在Theano中,您可以在执行相应的eval()函数后查看唯一的所谓共享变量.有关详细信息,请参阅此问题.