【问题标题】:How to recover original values after a model predict in keras?在keras中预测模型后如何恢复原始值?
【发布时间】:2016-06-02 15:19:01
【问题描述】:

这是一个更具概念性的问题,但我不得不承认我已经处理了一段时间了。

假设您想训练一个神经网络 (NN),例如使用 keras。建议您在训练之前执行数据的标准化或标准化,例如,使用标准化:

x_new = (x_old - mean)/standarddev

然后,你继续训练(model.fit in keras)并最小化损失函数,一切都很好。

编辑:在我的例子中,我有一组介于 200 和 400 之间的值。它是一个具有 1 个输入、1 个输出的 NN。我按照告知的方式对输入值和期望值进行了标准化,因此 NN 以 标准化 方式学习权重和偏差。

现在,假设我有一个值在 200 到 400 之间的全新数据集,并且我想使用具有先前训练的 NN 来预测输出。您可以在 keras 中使用 model.predict(x)x 我收到的全新值集,标准化(或标准化),因为您的 NN 是以这种方式训练的。但是,在predict 之后,我得到的是一组标准化的值,但我想将它们映射到通常的 200 到 400 范围。而且我不知道该怎么做。

我知道您可以在不进行标准化或标准化的情况下进行训练,但我已经读过,如果您标准化(或标准化),值在单位(神经元)的输出范围内(例如,在 0 和1 为 sigmoid),训练得到改善。

谢谢。

【问题讨论】:

  • 好的 - 让我们看看我是否理解:你得到了你的数据,你把它放到神经网络中,以标准化的形式 - 你想恢复它的原始值吗?或者你想去标准化你的输出?而且 - 顺便说一句。你的函数的输出是什么?一些代码可能有用。
  • 是的,我有一个 x 输入数组和一个 y 输出数组,其值在 200 到 400 之间。它们都经过标准化并执行了训练。之后,我有一个新数组 x_2,其值在 200 到 400 之间,我想在 keras 中使用 predict 预测结果。问题是神经网络已经以标准化的方式进行了训练。如果我标准化这个新数组x_2 我得到的,我们称之为y_2 是标准化的,我想要的是denormalize,得到200 到400 之间的值。

标签: python neural-network keras


【解决方案1】:

好的,我认为我正确理解了您的问题,所以我将尝试向您解释如何处理数据规范化:

1.关于输入和输出分布的假设: 通常在神经网络训练中 - 您假设您的数据(输入和输出)来自一些概率分布:我们称其为 X 用于输入和 Y 的输出。有一些原因使这种分布在训练阶段是零均值单位标准差

2。数据规范化和恢复的统计部分:因此 - 您必须在训练网络期间解决另一项任务。此任务是估计输入分布 X 和输出分布 Y均值标准差。您只需将经验均值和标准差应用于您的训练数据即可。

3。应用阶段 - 输入: 当您将模型应用到新输入时,您还假设您的输入来自分布 X,因此您还需要将其标准化为 零均值 和 单位标准差,这是一个有趣的部分 - 您可以同时使用训练集和一组新数据来更好地估计 X 的均值和标准差 但是为了避免验证案例中的过度拟合——您通常使用在训练阶段获得的均值和标准差来使新数据标准化。

4.应用阶段 - 输出:这部分比较棘手,因为当您将网络应用到新的标准化输入时,您会从 Y* ~ (Y - mean'(Y)) / sd'(Y) 其中 mean'(Y)sd'(Y) 是根据经验从您的 训练集 获得的均值和标准差的估计值,并且Y 是您的输出的原始分布。这是因为在您的训练集中,您向优化器提供了来自此分布的输出数据。因此,要使您的输出重新标准化,您需要应用转换:Y* * sd'(Y) + mean'(Y)。这与标准化转换相反。

总结:

您的培训和申请阶段如下所示:

  1. 您正在通过计算训练输入的经验平均值和标准差(mean'(X)sd'(X) strong> 以及输出的经验平均值和标准差(mean'(Y)sd'(Y))。存储它们很重要,因为它们将需要申请阶段。
  2. 您将输入和输出数据标准化为零均值单位标准差,并以此为基础训练模型。
  3. 在应用阶段,您可以通过将输入减去存储的 mean'(X) 并除以存储的 sd'(X) 来标准化输入以获得新的输出 是*
  4. 您使用存储的 mean'(Y)sd'(Y) - 在训练阶段获得 - 通过转换 (Y* * sd '(Y) + 平均值'(Y)

我希望这个答案能解决你的问题,让你对数据的标准化和去标准化的细节毫无疑问:)

【讨论】:

  • 好的,Marcin,我想这解决了我的问题,谢谢。我知道如何应用它,但我想我仍然有一个概念上的疑问:为什么我必须始终使用训练阶段的 mean'(X) 和 mean'(Y) (对于 std 也一样)?也就是说,这对我来说似乎很奇怪,因为您可以使用新数据集的均值进行预测,(比如说 mean''(X_new)),它更接近预测输入数据集的实际均值。
  • 至少有三个原因: 1. 新旧值都应该来自同一个分布——所以没关系。 2. 你的模型是根据旧数据学习的。 3. 你知道你的模型在旧规范化下的表现。由于您无法识别的新数据集中存在偏差,因此从新数据中获取统计数据可能会有风险。
  • 好的,马辛。我觉得我懂了。谢谢你所做的一切。
【解决方案2】:

您使用以下公式标准化了输入/输出值:

X_s = (X - mean) / std

要去标准化,您必须具有输入和输出的均值和标准值。将它们保存在某处,然后使用以下等式:

X = X_s * std + mean

例如,假设对于您的 [200, 400] 范围,平均值为 300,标准差为 100。然后说,对于 0.5 的归一化值,非归一化值为:

X = 0.5 * 100 + 300 = 350

如果您没有存储均值/标准差,那么您将无法恢复原始值。

【讨论】:

  • 是的,我知道。你可以在训练阶段之后这样做来去规范化。问题是,使用新数据集进行预测时,您必须使用新的均值和新的标准差,或者可能是旧的?那是我的疑问。不过谢谢你的回答。
  • @David,您使用训练网络时使用的那些,这就是您所说的旧的。
【解决方案3】:

取决于你是否标准化你的输出:

1.如果不是:那么你的输出值没有标准化,你不必担心。

2。如果是: 那么您只需通过 (output * sd) + mean 保持您的 mean/sdunstadarize 您的输出

【讨论】:

  • Marcin,谢谢你的回答,但恐怕我不完全理解你。我将编辑我的问题以使其更清楚。
猜你喜欢
  • 1970-01-01
  • 2019-05-22
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2017-10-22
  • 2019-07-11
  • 2012-09-14
相关资源
最近更新 更多