在多对多场景

时间:2016-11-14 21:08:27

标签: theano keras recurrent-neural-network lstm keras-layer

我是RNN和keras的新手。

我试图将LSTM的性能与传统的机器学习算法(如RF或GBM)在顺序数据上进行比较(不一定是时间序列,而是按顺序)。我的数据包含276个预测变量和一个输出(例如股票价格与股票公司的276种不同信息),具有8564个逆向观察值。由于LSTM非常适合捕捉顺序趋势,因此我决定使用300的time_step。从下图中,我相信我的任务是创建一个多对多网络(左上图)。 (PIC:http://karpathy.github.io/2015/05/21/rnn-effectiveness/

enter image description here

每个粉红色的盒子大小为276(预测器数量)和300(time_steps)这样的粉红色盒子。但是,我很难看到我如何设计蓝色盒子,因为每个蓝色盒子应该是输出每个实例的(股票价格)。来自Keras gihub论坛#2403#2654上的其他帖子,我想我必须实现TimeDistributed(Dense()),但我不知道如何。这是我检查它是否有效的代码(train_idv是要预测的数据,train_dv是股票价格)

train_idv.shape
#(8263, 300, 276)
train_dv.shape
#(8263, 300, 1)
batch_size = 1
time_Steps=300
model = Sequential()

model.add(LSTM(300,
        batch_input_shape=(batch_size, time_Steps, train_idv.shape[2]),
        stateful=True, 
        return_sequences=True))
model.add(Dropout(0.3))

model.add(TimeDistributed(Dense(300))) 

# Model Compilation
model.compile(loss='mean_squared_error',optimizer='adam',metrics=['accuracy'])

model.fit(train_idv, traindv, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)

运行model.fit会出现此错误

  

追踪(最近一次通话):     文件"",第1行,in     File" /home/user/.local/lib/python2.7/site-packages/keras/models.py" ;,第627行,in fit       sample_weight = sample_weight)     文件" /home/user/.local/lib/python2.7/site-packages/keras/engine/training.py" ;,第1052行,in fit       =的batch_size的batch_size)     文件" /home/user/.local/lib/python2.7/site-packages/keras/engine/training.py" ;,第983行,_standardize_user_data       exception_prefix ='模型目标')     文件" /home/user/.local/lib/python2.7/site-packages/keras/engine/training.py" ;,第111行,在standardize_input_data中       STR(array.shape))   例外:检查模型目标时出错:预期timedistributed_4具有形状(1,300,300)但具有形状的数组(8263,300,1)

现在,我已经成功运行了time_step = 1并且只使用Dense(1)作为最后一层。但是我不确定我应该如何塑造我的train_dv(训练中的输出)或如何正确使用TimeDistributed(Dense())。最后,我想使用

trainPredict = model.predict(train_idv,batch_size=1)

预测任何数据的分数。

我也在keras github论坛上发布了this question

1 个答案:

答案 0 :(得分:3)

从您的帖子中我了解到您希望每个LSTM时间步骤预测单个标量是否正确?然后,时间分布密集层应该具有输出1,而不是300(即TimeDistributed(Dense(1)))。

另外供您参考,keras回购中有一个使用Time Distributed Dense的例子。

在这个例子中,我们基本上想要为每个时间步长训练一个多类分类器(具有共享权重),其中不同的可能类是不同的可能数字字符:

# For each of step of the output sequence, decide which character should be chosen
model.add(TimeDistributed(Dense(len(chars))))

时间步数由前面的循环图层定义。