【问题标题】:LSTM layer does not accept the input shape of CNN layer outputLSTM 层不接受 CNN 层输出的输入形状
【发布时间】:2020-08-31 15:57:11
【问题描述】:

我正在尝试创建一个 CNN + LSTM 网络,但 LSTM 层不接受输入形状。有什么我可以做的吗?

model = Sequential()
model.add(Conv2D(128, (2,2), padding = 'same', input_shape=(30, 216, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))

model.add(Conv2D(256, (2,2), padding = 'same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))

model.add(LSTM(512, input_shape = (7, 54, 256,)))
model.add(Flatten())
model.add(Dense(7, activation='softmax'))

ValueError:lstm_21 层的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 7, 54, 256]

【问题讨论】:

标签: python lstm sequential conv-neural-network


【解决方案1】:

Keras 中的LSTM 层需要这种格式作为输入:

inputs: A 3D tensor with shape [batch, timesteps, feature].

因此,您不能直接传递非循环层。首先,Flatten() 之前的层,然后将该层包裹到 TimeDistributed 层中,如下所示:

model.add(TimeDistributed(Flatten()))
model.add(LSTM(8))

这个TimeDistributed允许对输入的每个时间切片应用层。这是一个完整的示例:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, LSTM, \
    Dense, Flatten, Dropout, MaxPooling2D, Activation, TimeDistributed
import numpy as np

X = np.random.rand(100, 30, 216, 1)
y = np.random.randint(0, 7, 100)

model = Sequential()
model.add(Conv2D(16, (2,2), padding = 'same', input_shape=(30, 216, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))

model.add(Conv2D(32, (2,2), padding = 'same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(8))
model.add(Dense(7, activation='softmax'))

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
history = model.fit(X, y)

【讨论】:

  • 感谢您的回复尼古拉斯。即使使用您的代码,它不再抛出错误,笔记本(Jupyter 和 google collab)在第 4 批之前的第一个时期崩溃。我已经尝试改变层数和参数,并大幅减少训练和测试数据。 GPU 使用率为 60%,CPU 为 30%,所以我怀疑问题是否存在。为了给你更多的背景知识,我正在尝试基于论文“使用深度 1D 和 2D CNN LSTM 网络的语音情感识别”的 NN 架构进行语音情感分类。
  • 是的,可能是因为你放置了大量的神经元。然而,这是一个不同的问题。如果您发布的问题已解决,则应将其标记为这样
猜你喜欢
  • 2018-02-27
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2019-09-11
  • 1970-01-01
相关资源
最近更新 更多