python-3.x - Python - 基于 LSTM 的 RNN 需要 3D 输入?

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

我正在尝试构建一个基于 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

最佳答案

你的主要错误是误解了 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 layer is a recurrent layer, hence it expects a 3-dimensional input (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-3.x - Python - 基于 LSTM 的 RNN 需要 3D 输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48475255/

相关文章:

python - 用户定义的函数不适用于 Pandas

python - Python3 中德语元音变音的编码/解码

tensorflow - 如何在 Keras 中的两个 LSTM 层之间添加注意层

python-3.x - SQLAlchemy 如何仅更新记录的某些字段

python - 所有任务完成后如何终止 python asyncio event_loop

python-3.x - 如何用keras测试深度学习模型?

python - 如何在 Tensorflow 2 中获取 Conv2D 内核值

callback - Keras 在每批后获取模型输出

tensorflow - LSTM Keras 之上的 Attention

machine-learning - LSTM 批处理与时间步