首页 > 解决方案 > 如何规范化多输入神经网络?

问题描述

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

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

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

a 的范围为 100-1000

b 的范围为 1-10

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

我的输出数据现在需要是明天 a (在 t+1 时的 a)的预测,因此再次具有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))

非常感谢!

标签: kerasneural-networklstmnormalization

解决方案


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

但是,请考虑编辑您的问题以包含一些数据和示例代码。请参阅如何创建最小、完整和可验证的示例


推荐阅读