如何规范化多输入神经网络?

How to normalize a multiple input neural network?

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

我是否需要对彼此独立的输入变量进行归一化,然后只使用我也想要的变量的比例作为输出来重新调整我的数据。

例如:我有输入变量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))

非常感谢!

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

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

最好使用两个定标器,比如定标器a和定标器b。

然后用缩放器a缩放特征a,用缩放器b缩放特征b。然后使用滞后特征准备数据集。如果你预测的是特征b,用scaler b做预测和逆缩放。