i有3个时间序列,A,B和C,由30个时间步骤定义。我想构建一个LSTM,该LSTM作为输入,从时间步骤1到30的A,B的值从时间步骤1到时间步骤10,请预测其余20个时间步的C值。换句话说,我必须构建一个LSTM,该LSTM处理不同大小的序列输入(30和10)。我的想法是(例如使用0s)输入时间序列C,以便我可以拥有3个相同大小的序列并使用标准LSTM。
A1, A2, A3, ... A28, A29, A30 -->
B1, B2, B3, ... B28, B29, B30 --> LSTM --> C11, C12, ..., C30
C1, C2, C3, ... 0, 0, 0 -->
从技术上讲,这将起作用,但是,从概念的角度来看,这是正确的吗?LSTM是否足够聪明,可以忘记填充?
可能有各种架构可以解决此问题,但是由于您听起来像您有固定的30+30+10 = 70
输入大小,因此建议使用一个标准的feedforward网络,该网络采用70
输入功能,具有一个或多个密集连接的隐藏层,并输出与要预测的C
缺失值相对应的20
值。
在Keras
中,这可能看起来像:
model = Sequential()
model.add(Dense(500, input_dim=70))
model.add(Activation('relu'))
model.add(Dense(300))
model.add(Activation('relu'))
model.add(Dense(20))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
如果您在训练期间有梯度问题,请尝试在ReLU
之后添加BatchNormalization
层,如果您要过度拟合尝试减少隐藏层的数量和/或在ReLU
和BatchNorm
之后添加Dropout
。
特别是对于这个相对较小的,更重要的是固定输入大小,无需使用诸如LSTM
之类的序列模型。它们更难使用,并且通常只有在您的输入不具固定尺寸时才值得。
如果您发现自己确实需要建模本地时间功能的体系结构,则可以尝试使用30x3
输入形状的CC_13使用1D
卷积来建模本地时间依赖性。在这种情况下,您可以按照您的建议为零pad C
。
编辑:@tituspullo在聊天中提到,他尝试了此 CNN
的示例,以用于多个输出时间表预测。