LSTM Keras 网络的常量输出和预测语法
Posted
技术标签:
【中文标题】LSTM Keras 网络的常量输出和预测语法【英文标题】:Constant Output and Prediction Syntax with LSTM Keras Network 【发布时间】:2018-03-12 17:40:09 【问题描述】:我是神经网络的新手,有两个可能非常基本的问题。我正在建立一个通用的 LSTM 网络来预测序列的未来,基于多个特征。 因此,我的训练数据具有一定的形状(训练序列的数量、每个序列的长度、每个时间步的特征量)。 或者更具体一点,比如 (2000, 10, 3)。 我尝试预测一个特征的价值,而不是全部三个。
-
问题:
如果我让我的网络更深和/或更宽,我得到的唯一输出是要预测的值的恒定平均值。以此设置为例:
z0 = Input(shape=[None, len(dataset[0])])
z = LSTM(32, return_sequences=True, activation='softsign', recurrent_activation='softsign')(z0)
z = LSTM(32, return_sequences=True, activation='softsign', recurrent_activation='softsign')(z)
z = LSTM(64, return_sequences=True, activation='softsign', recurrent_activation='softsign')(z)
z = LSTM(64, return_sequences=True, activation='softsign', recurrent_activation='softsign')(z)
z = LSTM(128, activation='softsign', recurrent_activation='softsign')(z)
z = Dense(1)(z)
model = Model(inputs=z0, outputs=z)
print(model.summary())
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
history= model.fit(trainX, trainY,validation_split=0.1, epochs=200, batch_size=32,
callbacks=[ReduceLROnPlateau(factor=0.67, patience=3, verbose=1, min_lr=1E-5),
EarlyStopping(patience=50, verbose=1)])
如果我只使用一层,比如:
z0 = Input(shape=[None, len(dataset[0])])
z = LSTM(4, activation='soft sign', recurrent_activation='softsign')(z0)
z = Dense(1)(z)
model = Model(inputs=z0, outputs=z)
print(model.summary())
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
history= model.fit(trainX, trainY,validation_split=0.1, epochs=200, batch_size=32,
callbacks=[ReduceLROnPlateau(factor=0.67, patience=3, verbose=1, min_lr=1E-5),
EarlyStopping(patience=200, verbose=1)])
这些预测有些合理,至少它们不再是一成不变的。
为什么会这样?大约 2000 个样本并不多,但在过度拟合的情况下,我希望预测能够完美匹配......
-
编辑:已解决,如 cmets 中所述,只是 Keras 始终期望 Batches:Keras
当我使用时:
`test=model.predict(trainX[0])`
为了得到第一个序列的预测,我得到一个维度错误:
“检查时出错:预期 input_1 有 3 个维度,但得到的数组的形状为 (3, 3)”
我需要输入一个序列数组,例如:
`test=model.predict(trainX[0:1])`
这是一种解决方法,但我不确定这是否有更深层次的含义,或者只是语法问题......
【问题讨论】:
您是否将您的代码与这些示例进行了比较? keras.io/getting-started/sequential-model-guide 也许尝试重新初始化模型几次(再次创建它),看看它是否有时能工作...... ---关于问题2,keras总是期待“批次”。这就是为什么你需要传递一个序列数组,而不是一个序列。 Jonathon:你有什么具体的例子吗?我的代码似乎确实有效,因为只有大型网络才能提供恒定的输出,这似乎是一个设计问题,而不是基于语法的问题等。@Daniel:是的,我多次运行脚本,一遍又一遍地创建模型。我认为有时有“中等”尺寸的模型,有时有效,有时无效...... 【参考方案1】:这是因为您没有对输入数据进行标准化。
任何神经网络模型最初都会将权重归一化在零附近。由于您的训练数据集具有所有正值,因此模型将尝试调整其权重以仅预测正值。但是,激活函数(在您的情况下为 softsign)会将其映射到 1。因此模型除了添加偏差之外什么也做不了。这就是为什么您会在数据集的平均值周围得到一条几乎恒定的线。
为此,您可以使用sklearn 等通用工具来预处理您的数据。如果你使用的是 pandas 数据框,这样的东西会有所帮助
data_df = (data_df - data_df.mean()) / data_df.std()
或者想要模型中有参数,可以考虑在模型中加入batch normalization层
【讨论】:
以上是关于LSTM Keras 网络的常量输出和预测语法的主要内容,如果未能解决你的问题,请参考以下文章