python - 基于中间层输出的 Keras 度量
问题描述
问题:我想在训练期间更好地监控我的模型。因为在某些情况下,损失会在训练过程中突然变成 nan,我想知道当这种情况发生时模型在做什么。除此之外,我想看看某个层是否符合特定条件(行和列应该总和为一个)。
方法:定义一个自定义指标将无济于事,因为该指标仅适用于y_pred
and y_true
。也许有一些复杂的解决方案,在模型中构建模型,并尝试以某种方式计算中间模型层输出的度量。但这感觉有点太复杂了。
解决方案:否则我唯一能想到的就是切换到 Tensorflow 本身,这样我就可以更好地控制训练过程。还有其他想法吗?
解决方案
有几种方法可以在不需要构造回调的情况下执行此操作,具体取决于您添加损失的方式。
如果使用 model.add_loss 添加损失,则需要通过在编译步骤之后添加度量来通过变通方法显示它(如此处所述)
这会导致类似这样的结果(特别是对于 VAE,人们对 kl_loss 感兴趣,这取决于中间层):
reconstruction_loss = mse(K.flatten(inputs), K.flatten(outputs))
kl_loss = beta*K.mean(- 0.5 * 1/latent_dim * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1))
model.add_loss(reconstruction_loss)
model.add_loss(kl_loss)
model.compile(optimizer='adam')
model.metrics_tensors.append(kl_loss)
model.metrics_names.append("kl_loss")
model.metrics_tensors.append(reconstruction_loss)
model.metrics_names.append("mse_loss")
对我来说,这给出了这样的输出:
Epoch 1/1
252/252 [==============================] - 23s 92ms/step - loss: 0.4336 - kl_loss: 0.0823 - mse_loss: 0.3513 - val_loss: 0.2624 - val_kl_loss: 0.0436 - val_mse_loss: 0.2188
如果您不使用 model.add_loss 而是直接在编译器中传递损失,那么您需要定义自定义指标(类似于自定义损失指标)并将指标传递给编译步骤。在上述情况下:
def customMetric(kl_loss):
def klLoss(y_true,y_pred):
return kl_loss
return klLoss
model.compile(..., metrics=[customMetric(kl_loss)])
推荐阅读
- ios - 在
没有 ViewControllers 的 SwiftUI 5.3 你在哪里覆盖运动事件 - python - /stories/6/segnala-commento/14/'NoneType' 对象的 AttributeError 没有属性 'storia' Django
- python - 在 Python 中打开文件时出现 Apache 权限错误
- node.js - 如何在reactjs中使用axios通过api从数据库中获取数据?
- javascript - 离开域并返回后如何保存我的 VueX 状态?
- node.js - 如何在依赖部分的 package.json 文件中添加环境变量?
- php - 在 Woocommerce 中退款时不要更改订单总额
- javascript - 如何在反应中在地图上显示来自图像 URl 的图像
- git - 无法配置 git 终端来推送已创建的项目
- html - 如何在 CSS 中创建斜线