tensorflow - 在数据集中使用具有多个输出的张量流时间序列预测时的损失计算
问题描述
我目前正在迈出第一步,使用本教程预测时间序列数据:https ://www.tensorflow.org/tutorials/structured_data/time_series?hl=en 。基本上我的数据结构如下所示: 窗口形状:(4, 25, 7) 输入形状:(4, 24, 7) 标签形状:(4, 24, 7) 所以我有 4 个批次,每个批次包括 24时间步长,移动一个时间步长以预测未来一个时间步长,输入和输出的数量等于 7。
我很好地应对它并获得了很好的结果,但是我并不完全了解我的模型是如何计算损失的,因为我预测了多个输出。
我在其他几篇文章中读到损失是所有损失的加权平均值,所以我的第一个问题是我如何获得权重,因为它们不是 1,如下例所示。例如,我将其作为使用 MSE 作为损失函数的测试数据评估我的 LSTM 模型的输出:
'loss': 0.07555752247571945, 'mean_squared_error': 0.07555752247571945
.
但是,如果我手动计算 7 个输出中的每一个的 MSE(如下所示
mse = sklearn.metrics.mean_squared_error(y_true, y_pred)
:)
我得到如下结果:
MSE output1: 0.15073139244785544 MSE output2: 0.4056892902723751 MSE output3: 0.153076260986768 MSE output4: 0.1355237314963766 MSE output5: 0.06888711243916067 MSE output6: 0.05889301984662596 MSE output7: 0.001679575052314814
当我将它们相加并除以 7 时,我最终不会得到相同的结果,即 Keras 使用的权重不是一个。Keras 损失 ~ 0.0756; 手动损失 ~ 0.139。所以我想知道,如何查看用于计算损失的权重,以及如何更改它们以便将 LSTM 模型的训练更多地集中在特定输出上?
我已经尝试过的一种更改权重的选项是在我的 model.compile 模型的一部分中添加 loss_weights 。在这里,问题出现了,我的 model.compile 部分仅“看到”一个输出,因此传递具有 7 个值的权重数组是无效的,因为只有第一个值在乘以计算出的损失的方式中得到尊重。例如:`weights = [1,1,1,1,1,1,1]'
model.compile(optimizer=keras.optimizers.Adam(),loss_weights = weights)
'loss': 0.07555752247571945
改变所有重量:
weights = [2.0,2.0,1.2,1.5,0.5,1.0,1.0]
'loss': 0.1511150449514389
我相信这是由于映射的数据集结构。(实际上我真的有 7 个输出,否则我无法计算 7 个输出中的每一个的 MSE)。有谁知道如何将 loss_weights 与 Dataset 结构一起使用?
解决方案
推荐阅读
- sql - 您如何在 SQL 中按组对不同的“策略周期”进行分段(以随后计算每个“策略周期”的运行总数)?
- python - 替换 Python 字典中的字符
- scala - 火花流将base64 rdd保存到s3上的json
- javascript - 为什么我的 google API 密钥在 100 个请求后中断
- python - 从字典列表重建列表
- android - 无法加载库 mongo_embedded
- c# - 组合框的选定项在 xaml 中设置,但绑定属性为空
- python - 如何使用烧瓶从外部范围访问变量?
- bash - Bash:遍历目录和子目录(包括隐藏文件)的正确方法是什么?
- xml - 有没有一种简单的方法可以复制 XML 文档,但更改日期节点的格式?