【问题标题】:How to normalize a multiple input neural network?如何规范化多输入神经网络?
【发布时间】:2019-08-19 04:02:44
【问题描述】:

我确实有一个关于如何规范化的问题,尤其是关于如何对具有多个输入和只有一个输出的神经网络进行非规范化。

我是否需要相互独立地标准化输入变量,然后只使用我也想要的变量的比例作为输出来重新调整我的数据。

例如:我有输入变量 a 和 b。

a 的范围为 100-1000

b 的范围为 1-10

归一化后,两个变量都在 0-1 的范围内。

我的输出数据现在需要是明天的预测 a(a at t+1),因此再次具有 100-1000 的范围。 因此,我是否会根据我对 a 进行归一化(逆 a 的归一化)的方式简单地进行非归一化?还是我需要考虑其他事情?

为了规范化这两个变量,我的代码如下所示:

from pandas import Series
from sklearn.preprocessing import MinMaxScaler

series1 = Series(df["a"])
series2 = Series(df["b"])

values1 = series1.values
values1 = values1.reshape((len(values1), 1))
values2 = series2.values
values2 = values2.reshape((len(values2), 1))

scaler1 = MinMaxScaler(feature_range=(0, 1))
scaler1 = scaler1.fit(values1)
scaler2 = MinMaxScaler(feature_range=(0, 1))
scaler2 = scaler2.fit(values2)

normalized1 = scaler1.transform(values1)
df["Normalized_a"] = normalized1
normalized2 = scaler2.transform(values2)
df["Normalized_b"] = normalized2

closesnorm1 = df["Normalized_a"]
closesnorm2 = df["Normalized_b"]

### Combine two variables into one NumPy array
normalizeddata = df[["Normalized_a","Normalized_b"]].values

然后我拆分数据:

### Split the data
X_train = []
y_train = []
for i in range (3, len(normalizeddata) - 3):
    y_train.append(normalizeddata[i,0])
    X_train.append(np.array((normalizeddata[i+1:i+4][::-1])))

X_train = np.array(X_train).reshape(-1,3,2)
y_train = np.array(y_train)

X_test = []
y_test = []
for i in range (0,3):
    y_test.append(normalizeddata[i,0])
    X_test.append(np.array((normalizeddata[i+1:i+4][::-1])))

X_test = np.array(X_test).reshape(-1,3,2)
y_test = np.array(y_test)

考虑到两个变量的模型本身如下所示(参见 NumPy 数组的输入形状):

model = Sequential()
model.add(LSTM(100,activation="relu", input_shape = (3, 2),  return_sequences = True))
model.add(Dropout(0.2))
model.add(LSTM(100,activation="relu", return_sequences = False))
model.add(Dropout(0.2))
model.add(LSTM(1,activation ="relu"))
model.compile(optimizer="adam", loss="mse")
model.fit(X_train, y_train, batch_size = 2, epochs = 10)

最后但并非最不重要的是,我使用 Scaler1 对输出进行了非规范化:

### Predicting y_test data
y_pred = model.predict(X_test)
y_pred = y_pred.reshape(-1)
df_pred = df[:3]
df_pred["a_predicted"] = scaler1.inverse_transform(y_pred.reshape(-1, 1))

非常感谢!

【问题讨论】:

  • 您可以使用两种不同的缩放器,一种用于规范化输入特征,另一种用于规范化目标输出。然后稍后使用用于缩放目标特征的缩放器来反向缩放预测
  • @SreeramTP 非常感谢!我提供了一个代码示例,其中我使用了两个 Scaler。这样就对了?
  • 因此,您有 2 个特征,您必须使用这两个特征的滞后值来预测一个特征。我说的对吗?
  • @SreeramTP 是的,完全正确
  • 最好两个使用两个缩放器,比如缩放器 a 和缩放器 b。然后用缩放器 a 缩放特征 a,用缩放器 b 缩放特征 b。然后使用滞后特征准备数据集。如果您要预测的特征 b,请使用缩放器 b 进行预测和反向缩放

标签: keras neural-network lstm normalization


【解决方案1】:

最好两个使用两个缩放器,比如缩放器 a 和缩放器 b。

然后用缩放器 a 缩放特征 a,用缩放器 b 缩放特征 b。然后使用滞后特征准备数据集。如果您正在预测的特征 b 中,请使用缩放器 b 进行预测和反向缩放。

【讨论】:

    【解决方案2】:

    这取决于输出层中的激活函数以及您用于训练的目标输出。由于您似乎希望输出与输入之一相同,因此对我来说,以与标准化 a 相同的方式标准化目标输出似乎很自然,并且当您使用网络进行召回时,使用逆a 的标准化。

    但是,请考虑编辑您的问题以包含一些数据和示例代码。见How to create a Minimal, Complete, and Verifiable example

    【讨论】:

    • 非常感谢!现在我在示例中提供了一些代码。所以我使用两个缩放器并简单地使用目标输出的缩放器的方式与我在开始时对“a”进行标准化的方式相同似乎是正确的?
    • 我觉得不错。顺便说一句,如果您对答案感到满意,请考虑接受它。
    猜你喜欢
    • 2020-05-01
    • 2015-11-26
    • 2017-02-24
    • 2018-09-10
    • 1970-01-01
    • 2012-10-05
    • 2014-10-25
    • 2017-03-16
    相关资源
    最近更新 更多