将 Keras 模型的输出重新缩放回原始比例

Posted

技术标签:

【中文标题】将 Keras 模型的输出重新缩放回原始比例【英文标题】:Re-scaling outputs from a Keras model back to original scale 【发布时间】:2017-12-04 08:45:06 【问题描述】:

我是神经网络的新手(只是免责声明)。

我有一个基于 8 个特征预测混凝土强度的回归问题。我首先做的是使用 min-max 归一化重新调整数据:

# Normalize data between 0 and 1
from sklearn.preprocessing import MinMaxScaler

min_max = MinMaxScaler()
dataframe2 = pd.DataFrame(min_max.fit_transform(dataframe), columns = dataframe.columns)

然后将数据帧转换为 numpy 数组并将其拆分为 X_train、y_train、X_test、y_test。 现在这里是网络本身的 Keras 代码:

from keras.models import Sequential
from keras.layers import Dense, Activation

#Set the params of the Neural Network
batch_size = 64
num_of_epochs = 40
hidden_layer_size = 256

model = Sequential()
model.add(Dense(hidden_layer_size, input_shape=(8, )))
model.add(Activation('relu'))
model.add(Dense(hidden_layer_size))
model.add(Activation('relu'))
model.add(Dense(hidden_layer_size))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('linear'))


model.compile(loss='mean_squared_error', # using the mean squared error function
              optimizer='adam', # using the Adam optimiser
              metrics=['mae', 'mse']) # reporting the accuracy with mean absolute error and mean squared error

model.fit(X_train, y_train, # Train the model using the training set...
          batch_size=batch_size, epochs=num_of_epochs,
          verbose=0, validation_split=0.1)

# All predictions in one array
predictions = model.predict(X_test)

问题:

    predictions 数组将包含缩放格式的所有值(介于 0 和 1 之间),但显然我需要预测为真实值。如何将这些输出重新调整为实际值?

    Min-Max 还是 Z-Score 标准化更适合回归问题?这个“批量标准化”怎么样?

谢谢,

【问题讨论】:

你的问题有点太宽泛了:它包含2个问题,第一个(重新缩放)与keras无关。 您的第一个问题已得到解答,第二个问题超出了 *** 的范围。请查看stats.stackexchange.com 【参考方案1】:

根据doc,MinMaxScaler 类有一个 inverse_transform 方法,可以满足您的要求:

inverse_transform(X):根据feature_range撤销X的缩放。

【讨论】:

嗨,Camilleri,只有一个问题。在我的情况下,我在 -1,1 之间缩放输入数据,但在 model.predict() 的输出中,数据范围不在 -1 和 1 之间。我有一些奇怪的值,比如 -1.00688391 知道为什么吗?我认为当我使用 inverse_transofrm() 重新调整时,这会导致不好的结果 @mik1904 最后一层的非线性是什么?对于输出在 [0, 1] 它应该是一个 sigmoid,所以在你的情况下,公式可以是 2 * sigmoid - 1。这应该强制结果在 -1 和 1 之间 你有什么问题?我有一个带有一个隐藏层激活函数线性的 LSTM @mik1904 如果您不使用特殊函数作为最后的线性来限制输出值的范围,那么您没有理由不会得到 -1, 1 之外的东西 所以线性激活函数应该没有问题吧?【参考方案2】:

对于 1.:将 inverse_transform() 与您已 fit_transformed 原始数据相同的 MinMaxScaler 一起使用:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html#sklearn.preprocessing.MinMaxScaler.inverse_transform

【讨论】:

但是模型在训练期间报告的 MAE/MSE 仍然会使用“错误”的尺度。有没有办法在模型本身内部进行反向缩放? @HansBouwmeester 您可以在最后一层之后使用Lambda layer 进行反向缩放。您必须在 tf.Tensors 上实现它,因此您可能无法直接使用 MinMaxScaler.inverse_transform,但手动编写逆变换非常简单。

以上是关于将 Keras 模型的输出重新缩放回原始比例的主要内容,如果未能解决你的问题,请参考以下文章

Solidworks如何等比例缩小放大模型

使用 dae 文件播放动画时 SCNNode 比例发生变化

如何在缩放的 CALayer 中保持子层的比例

特征缩放以相同比例转换列中的不同值

fusuon360怎么整体调整比例

解决 图片在div中等比例缩放问题 (未解决:图片比例小于盒子模型时不会自动填充)