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

时间:2019-03-28 11:37:56

标签: keras neural-network lstm normalization

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

我是否需要彼此独立地对输入变量进行归一化,然后仅使用我也希望用作输出的变量的小数位数来重新缩放数据。

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

a的评分范围为100-1000

b的比例为1-10

归一化后,两个变量的比例均为0-1。

现在,我的输出数据需要成为明天的预测[strong>(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))

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

最好同时使用两个缩放器,例如缩放器a和缩放器b。

然后使用缩放器a缩放特征a和使用缩放器b缩放特征b。然后使用滞后特征准备数据集。如果您要预测的是特征b,请使用缩放器b进行预测和反比例缩放。