Python - 基于LSTM的RNN需要3D输入吗?

时间:2018-01-27 11:21:01

标签: python-3.x keras lstm recurrent-neural-network keras-layer

我正在尝试建立一个基于LSTM RNN的深度学习网络,这里是尝试的

for (File file : configFolder.listFiles()) {

但它让我得到以下错误

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.layers import Embedding
from keras.layers import LSTM
import numpy as np

train = np.loadtxt("TrainDatasetFinal.txt", delimiter=",")
test = np.loadtxt("testDatasetFinal.txt", delimiter=",")

y_train = train[:,7]
y_test = test[:,7]

train_spec = train[:,6]
test_spec = test[:,6]


model = Sequential()
model.add(LSTM(32, input_shape=(1415684, 8),return_sequences=True))
model.add(LSTM(64, input_dim=8, input_length=1415684, return_sequences=True))
##model.add(Embedding(1, 256, input_length=5000))
##model.add(LSTM(64,input_dim=1, input_length=10, activation='sigmoid',
##               return_sequences=True, inner_activation='hard_sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='rmsprop')

model.fit(train_spec, y_train, batch_size=2000, nb_epoch=11)
score = model.evaluate(test_spec, y_test, batch_size=2000)

以下是数据集

的示例

(患者编号,以毫秒为单位的时间,加速度计x轴,y轴,z轴,幅度,频谱图,标签(0或1))

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (1415684, 1)

在数据集中,我只使用光谱图作为输入特征,标签(0或1)作为输出,总跟踪样本为1,415,684

1 个答案:

答案 0 :(得分:2)

您的主要错误是误解LSTM(或任何RNN,实际上)如何工作以及它接受的输入。 LSTM网络的单个训练示例包含序列和标签。例如,这......

1,15,70,39,-970,947321,596768455815000,0
1,31,70,39,-970,947321,612882670787000,0
1,46,60,49,-960,927601,602179976392000,0
1,62,60,49,-960,927601,808020878060000,0
1,78,50,39,-960,925621,726154800929000,0

...是长度为5的序列,具有8个特征。整个序列的标签是下一行的标签列。请注意,这只是一个例子;批处理意味着几个这样的序列和标签。

现在,关于Keras,来自this answer

  

LSTM图层是一个循环图层,因此它需要一个三维输入(batch_size, timesteps, input_dim)

让我们仔细研究您的规范:input_shape=(1415684, 8)告诉keras期望长度为1415684的序列,其中每个项目都有8个功能。所有这些都不考虑批量大小,即2000

这显然不会起作用,因为1415684 LSTM序列太长了。经验证据表明,LSTM可以学习多达100个时间步长,因此喂食较大的序列不会让它学得更好。更不用说它没有记忆和时间效率。

您应该做的是选择较小的timesteps参数,例如timesteps=64,并将您的数据拆分为timesteps个后续行的块。块可能会相交。这些批次总共意味着batch_size * timesteps行,每行包含8列。 y_train应包含每个训练序列的基本事实。 Keras不会做这个准备步骤,所以你必须手动完成。