如何在 keras 中进行模型预测后恢复原始值?

How to recover original values after a model predict in keras?

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

假设您想训练一个神经网络 (NN),例如使用 keras。由于建议您在训练之前对数据进行归一化或标准化,因此,例如,进行标准化:

x_new = (x_old - mean)/standarddev

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

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

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

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

谢谢。

取决于您是否对输出进行标准化:

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

2。如果是: 那么你可以保持你的 mean/sd 并且 unstadarize your output 只需 (output * sd) + mean.

您使用以下公式标准化了您的 input/output 值:

X_s = (X - mean) / std

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

X = X_s * std + mean

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

X = 0.5 * 100 + 300 = 350

如果您没有存储 mean/std 那么您将无法恢复原始值。

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

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

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

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

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

摘要:

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

  1. 您正在通过计算训练输入的经验均值和标准差来获得训练阶段和应用阶段所需的统计数据(mean'(X) sd'(X) 以及输出的经验均值和标准差(mean'(Y)sd'(Y)). 存储它们很重要,因为它们将在应用程序阶段需要。
  2. 您将输入和输出数据标准化为零均值单位标准差并在其上训练您的模型。
  3. 在应用阶段,您通过减去存储的 mean'(X) 并除以存储的 sd'(X)[=66= 来标准化您的输入] 以获得新的输出 Y*
  4. 您使用存储的 mean'(Y)sd'(Y) 对输出进行去标准化 - 在训练阶段获得 - 通过转换(Y* * sd'(Y) + 均值'(Y).

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