keras - 如何规范化多输入神经网络?
问题描述
我确实有一个关于如何规范化的问题,特别是关于如何对具有多个输入和只有一个输出的神经网络进行非规范化。
我是否需要相互独立地标准化输入变量,然后只使用我也想要的变量的比例作为输出来重新调整我的数据。
例如:我有输入变量 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))
非常感谢!
解决方案
这取决于输出层中的激活函数以及用于训练的目标输出。由于您似乎希望输出与输入之一相同,因此对我来说,以与标准化相同的方式对目标输出进行标准化似乎很自然,并且当您使用网络进行召回时,使用'a
的倒数a
s 归一化。
但是,请考虑编辑您的问题以包含一些数据和示例代码。请参阅如何创建最小、完整和可验证的示例。
推荐阅读
- android-uiautomator - 如何计算 UiAutomator 中所有 RecyclerView 项目的不同项目
- python - 唯一约束失败:“app”_customuser.username
- javascript - 强制将块拆分为某个包
- django - 多个附件django电子邮件
- linq - 实体框架查询单个查询中的相关实体
- c# - 获取当前 AD 域加入信息的最可靠方法是什么?(DsRoleGetPrimaryDomainInformation,?)
- c - 如何将数组的最后一个元素设置为某个数字?
- sql - 从 MS Access 中的子查询中检索多个值
- presto - Presto Cassandra 连接器:连接数
- java - 如何让我的密钥库文件与我的 Java Vert.x 项目一起使用(密钥库格式无效)