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

时间:2016-06-02 15:19:01

标签: python neural-network keras

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

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

x_new = (x_old - mean)/standarddev

然后,你继续训练(keras中的model.fit)并尽量减少损失函数,非常好。

编辑:在我的情况下,我有一组介于200和400之间的值。这是一个NN,有1个输入,1个输出。我按照告诉标准化输入值和期望值,因此NN以标准化方式学习权重和偏差。

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

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

谢谢。

3 个答案:

答案 0 :(得分:3)

好的,我认为我的问题是正确的,所以我会试着解释一下如何处理数据规范化:

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

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

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

<强> 4。应用阶段 - 输出:这部分比较棘手,因为当您将网络应用于新的标准化输入时,您将获得 Y *〜(Y - mean'(Y))/ sd'(Y)<的新输出/ strong>其中意味着'(Y) sd'(Y)是根据您的训练集从经验上获得的平均值和标准偏差的估算值 Y 是您输出的原始分配。这是因为在训练集中,您可以为优化程序提供来自此分配的输出数据。因此,为了使您的输出重新进行转换,您需要应用转换: Y * * sd'(Y)+ mean'(Y)。这与标准化转型相反。

<强>概要

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

  1. 您通过计算训练输入的经验均值和标准差来获得训练阶段和应用阶段所需的统计数据(意味着'(X) sd'(X)和您的输出的经验均值和标准差(表示'(Y) sd'(Y))。存储它们很重要,因为它们将被需要申请阶段。
  2. 您将输入和输出数据标准化为零均值单位标准差并在其上训练您的模型。
  3. 在申请阶段,您可以通过存储的平均值'(X)减去输入并将存储的 sd'(X)除以得到新输出来标准化您的输入Y *
  4. 使用存储的平均值'(Y) sd'(Y) - 在训练阶段获得 - 通过转换(Y * * sd)对您的输出进行去标准化'(Y)+表示'(Y)
  5. 我希望这个答案可以解决您的问题,让您毫不怀疑数据的标准化和去标准化细节:)

答案 1 :(得分:1)

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

<强> 1。如果不是:那么您的输出值不是标准化的,您不必担心它。

<强> 2。如果是:,则只需{{1}}即可保持均值/ sd 取消您的输出

答案 2 :(得分:1)

使用以下公式对输入/输出值进行标准化:

X_s = (X - mean) / std

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

X = X_s * std + mean

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

X = 0.5 * 100 + 300 = 350

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