我试图用LSTM预测时间序列,并用Tendorflow后端在Keras中编写代码。我有30个输入功能(连续值)和1个二进制输出。我想使用每个输入功能的前20个时间步长来预测下一个时间步长的输出。我的批次大小为52。但是,在尝试定义输入层的形状时遇到困难。
根据Keras文档中堆叠的LSTM示例,3D张量的最后一个维度将为'data_dim'。是输入尺寸还是输出尺寸?如果这是输出尺寸,那么我不能使用多个输入功能,因为在我的情况下,input_shape将是(batch_size = 52,time_step = 20,data_dim = 1)。
另一方面,如果data_dim是输入形状,那么我试图定义一个四层LSTM,模型形状如下。
input_2(InputLayer)(52,20,30)0
lstm_3(LSTM)(52,20,128)81408
lstm_4(LSTM)(52,128)131584
总参数:213,121 可训练的参数:213,121 不可训练的参数:0
我是否正确编写了这部分代码?我的代码段如下。
input_layer=Input(batch_shape=(batch_size,input_timesteps,input_dims))
lstm1=LSTM(num_neurons,activation = 'relu',dropout=0.0,stateful=False,return_sequences=True)(input_layer)
lstm2=LSTM(num_neurons,activation = 'relu',dropout=0.0,stateful=False,return_sequences=False)(lstm1)
output_layer=Dense(1, activation='sigmoid')(lstm2)
model=Model(inputs=input_layer,outputs=output_layer)
我没有得到很好的结果,因此试图了解我的代码是否存在任何问题。
答案 0 :(得分:0)
如果要通过应用更多层来使用“深度学习”,则应缓慢减小隐藏层的特征空间,直到到达执行分类任务的层(输出层)为止。 您实际上是在隐藏层中使用较大的要素空间,确定您的数据能够满足要求吗?您是否有足够的数据来允许这样做? 否则,我会建议您这样,以便推断最重要的维度:
num_neurons1 = int(input_dims/2)
num_neurons2 = int(input_dims/4)
input_layer=Input(batch_shape=(batch_size, input_timesteps, input_dims))
lstm1=LSTM(num_neurons, activation = 'relu', dropout=0.0, stateful=False, return_sequences=True, kernel_initializer="he_normal")(input_layer)
lstm2=LSTM(num_neurons2, activation = 'relu', dropout=0.0, stateful=False, return_sequences=False, kernel_initializer="he_normal")(lstm1)
output_layer=Dense(1, activation='sigmoid')(lstm2)
model=Model(inputs=input_layer,outputs=output_layer)
此外,您还使用relu作为激活功能。它适合您的数据吗?最好在重新缩放和归一化后仅使用正数据。 如果合适,还可以相应地进行适当的内核初始化。 为了更好地理解该问题,您还可以在各个时期进行训练时发布优化器参数和行为。