Python - 基于 LSTM 的 RNN 需要 3D 输入?
Posted
技术标签:
【中文标题】Python - 基于 LSTM 的 RNN 需要 3D 输入?【英文标题】:Python - LSTM based RNN required 3D input? 【发布时间】:2018-07-06 14:43:28 【问题描述】:我正在尝试建立一个基于 LSTM RNN 的深度学习网络,这是尝试过的
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)
但它让我出现以下错误
ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (1415684, 1)
这是数据集中的一个样本
(患者编号、时间(以毫秒为单位)、加速度计 x 轴、y 轴、z 轴、幅度、频谱图、标签(0 或 1))
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
在数据集中,我只使用频谱图作为输入特征,标签(0 或 1)作为输出,总训练样本为 1,415,684
【问题讨论】:
【参考方案1】:您的主要错误是误解了 LSTM(或任何 RNN,实际上)的工作原理以及它接受什么作为输入。 LSTM 网络的单个训练示例由 sequence 和标签组成。比如这个……
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 层是循环层,因此它需要一个 3 维输入
(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 不会执行此准备步骤,因此您必须手动完成。
【讨论】:
以上是关于Python - 基于 LSTM 的 RNN 需要 3D 输入?的主要内容,如果未能解决你的问题,请参考以下文章
基于LSTM-RNN的深度学习网络的训练对比matlab仿真
深度学习之六,基于RNN(GRU,LSTM)的语言模型分析与theano代码实现