输出keras中的损失/成本函数

Posted

技术标签:

【中文标题】输出keras中的损失/成本函数【英文标题】:Output the loss/cost function in keras 【发布时间】:2018-07-13 10:29:44 【问题描述】:

我正在尝试在 Keras 中找到成本函数。我正在运行一个带有损失函数categorical_crossentropy 的 LSTM,并添加了一个正则化器。我如何在我的正则化器之后输出成本函数的样子以供我自己分析?

model = Sequential()
model.add(LSTM(
    NUM_HIDDEN_UNITS,
    return_sequences=True,
    input_shape=(PHRASE_LEN, SYMBOL_DIM),
    kernel_regularizer=regularizers.l2(0.01)
    ))
model.add(Dropout(0.3))
model.add(LSTM(NUM_HIDDEN_UNITS, return_sequences=False))
model.add(Dropout(0.3))
model.add(Dense(SYMBOL_DIM))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
    optimizer=RMSprop(lr=1e-03, rho=0.9, epsilon=1e-08))

【问题讨论】:

“看起来”是什么意思?您是否尝试在调用 model.fit 方法时查看损失? 【参考方案1】:

在我的正则化器之后如何输出成本函数的样子以供我自己分析?

当然,您可以通过获取您想要查看的层的输出 (yourlayer.output) 并打印它(参见 here)来实现这一点。然而,有更好的方法来可视化这些东西。

认识Tensorboard。

这是一个强大的可视化工具,使您能够跟踪和可视化您的指标、输出、架构、kernel_initializations 等。好消息是已经有一个Tensorboard Keras Callback 可以用于此目的;你只需要导入它。要使用它,只需将 Callback 的一个实例传递给您的 fit 方法,如下所示:

from keras.callbacks import TensorBoard
#indicate folder to save, plus other options
tensorboard = TensorBoard(log_dir='./logs/run1', histogram_freq=1,
    write_graph=True, write_images=False)  

#save it in your callback list
callbacks_list = [tensorboard]
#then pass to fit as callback, remember to use validation_data also
model.fit(X, Y, callbacks=callbacks_list, epochs=64, 
    validation_data=(X_test, Y_test), shuffle=True)

之后,通过执行以下命令启动您的 Tensorboard 服务器(它在您的 PC 上本地运行):

tensorboard --logdir=logs/run1

例如,这是我测试的两个不同模型上的内核的样子(要比较它们,您必须保存单独的运行,然后在父目录上启动 Tensorboard)。这是在我的第二层的直方图选项卡上:

left上的模型是我用kernel_initializer='random_uniform'初始化的,因此它的形状是均匀分布的。 右侧上的模型我使用 kernel_initializer='normal' 进行初始化,因此它在我的 epoch(大约 30 个)中显示为高斯分布。

通过这种方式,您可以以一种比打印输出更具交互性和更易理解的方式可视化您的内核和层的“外观”。这只是 Tensorboard 的强大功能之一,它可以帮助您更快、更好地开发深度学习模型。

当然,Tensorboard 回调和一般的 Tensorboard 有更多选项,因此如果您决定尝试此操作,我建议您仔细阅读提供的链接。有关更多信息,您可以查看this 和also this 问题。

编辑:因此,您评论说您想知道您的正则化损失在分析上“看起来”如何。让我们记住,通过向损失函数添加正则化器,我们基本上是在扩展损失函数以在其中包含一些“惩罚”或偏好。因此,如果您使用 cross_entropy 作为损失函数并添加权重为 0.01 的 l2 正则化器(即欧几里得范数),您的整个损失函数将如下所示:

【讨论】:

谢谢,我已经在运行张量板了。我的意思是我如何输出完整的损失函数作为其输入的可读函数。通常 cross_entropy 是我的损失函数,但是在添加正则化之后,我得到了奇怪的损失值。例如,如果我单独运行交叉熵,我的损失将如下所示:def loss(yHat, y):if yHat == 1:return -log(y)else:return -log(1 - y) 但由于我添加了正则化,我不知道它是什么样子 @MikeManh 好的,所以当您将正则化应用于您的模型时,您基本上是在“扩展”您的损失函数。假设你的损失函数是cross_entropy,你的正则化损失函数是J(x) = cross_entropy(x) + REG。在这种情况下,当您使用 l2 作为权重为 0.01 的正则化器时,它将是 J(x) = cross_entropy(x) + 0.01*l2(x)。这就是您的损失函数现在具有的分析形式。我说对了吗?

以上是关于输出keras中的损失/成本函数的主要内容,如果未能解决你的问题,请参考以下文章

Keras 中基于输入数据的自定义损失函数

如何在 keras 中实现 ssim 的损失函数?

Keras中损失函数的含义?

Keras/Tensorflow:单输出的组合损失函数

损失函数中带有 SVM 的最后一层 CNN

Keras 模型的验证损失与损失函数输出不匹配