首页 > 解决方案 > 在数据集中使用具有多个输出的张量流时间序列预测时的损失计算

问题描述

我目前正在迈出第一步,使用本教程预测时间序列数据: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 结构一起使用?

标签: tensorflowkerasdatasetloss

解决方案


推荐阅读