【问题标题】:Recover denormalized data during training在训练期间恢复非规范化数据
【发布时间】:2020-03-15 01:42:34
【问题描述】:

我正在使用 TensorFlow/Keras 来训练 CNN。我已经使用 0 到 1 之间的 MinMaxScaler 对我的输入 (X) 和输出 (Y) 数据进行了标准化(我的问题中有 2 个输入和 3 个输出),例如:

from sklearn.preprocessing import MinMaxScaler # For normalizing data
scaler = MinMaxScaler() # Define limits for normalize data
X = scaler.fit_transform(X) # Normalize input data
Y = scaler.fit_transform(Y) # Normalize output data

问题是,在训练期间,在每个时期,我都会得到一个标准化的损失值。反正我可以得到原始的损失值吗?

我知道有以下逆变换:

X = scaler.inverse_transform(X) # Inverse transformation of input data
Y = scaler.inverse_transform(Y) # Inverse transformation of output data

但我不确定如何在模型中执行这种非规范化。

【问题讨论】:

  • 为什么要“原始”损失值?使用自定义损失函数和/或 lambda 层应该是可能的,但我觉得这不值得对您的代码产生影响。
  • 这是一个回归问题,使用非规范化数据更容易解释我在每个时期结束时得到的结果。

标签: keras normalization denormalization


【解决方案1】:

作为一般经验法则,您不应试图更改损失函数以使其更易于解释。对于您的情况,我建议您发送custom metric。在您创建的自定义度量函数中,您可以对 y_true 和 y_pred 进行逆变换,然后在它们上计算您想要的任何值(例如 MAE)。

如果您想做一些不能仅仅作为指标处理的事情,您始终可以创建一个运行 on_epoch_endcustom lambda callback(或任何您想要的时间)。

【讨论】:

  • 我明白了......所以,我可以创建一个自定义指标并将其用作损失函数,而不是我的常规损失(我目前正在使用 MSE)?
  • @MuriloSouza 不要试图改变你的损失函数。如果你需要,你可以创建一个自定义的损失函数。但是,您正在寻找“可解释”的数字,因此您不应触及损失,而应使用自定义指标。我建议使用 MAE,因为我会说它比 MSE 更易于解释,但这是你的选择,取决于你想看到什么。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2019-07-15
  • 2017-01-14
  • 1970-01-01
  • 2018-09-01
  • 2010-10-06
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多