【问题标题】:ValueError: Input 0 is incompatible with layer lstm_14: expected ndim=3, found ndim=2ValueError:输入 0 与层 lstm_14 不兼容:预期 ndim=3,发现 ndim=2
【发布时间】:2019-03-11 05:46:08
【问题描述】:

我正在构建一个用于图像分类的 cnn_rnn 网络。在我的 jupyter notebook 中运行以下 python 代码时出现错误。

     # model
     model1 = Sequential()
     # first convolutional layer
     model1.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape(160, 120, 3)))
     # second convolutional layer
     model1.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
     #Adding a pooling Layer
     model1.add(MaxPooling2D(pool_size=(3, 3)))
     #Adding dropouts
     model1.add(Dropout(0.25))
     # flatten and put a fully connected layer
     model1.add(Flatten())
     model1.add(Dense(32, activation='relu')) # fully connected

     #Adding RNN N/W
     model1.add(LSTM(32, return_sequences=True))
     model1.add(TimeDistributed(Dense(5, activation='softmax')))

我还尝试将 input_shape=(160, 120, 3) 作为参数添加到 LSTM 函数,但无济于事。请帮忙!

P.S:我也尝试使用 GRU 而不是 LSTM,但得到了同样的错误。

更新:请注意 model.summary() 结果 enter image description here

【问题讨论】:

    标签: python lstm recurrent-neural-network


    【解决方案1】:

    您的错误是由于您在 LSTM 层之前使用了 Flatten 和 Dense。

    LSTM 层要求输入的形状为 (Batchsize x Length x Feature depth0)(或某些变体),而您的 flatten 将 Conv2D 输出从 (B x H x W x F) 更改为 (B x W * F * H) 如果这有意义的话。如果您想使用这种架构,我建议您使用 Reshape 层来展平您想要的尺寸,并在 LSTM 层之前使用内核大小为 1 的 Conv1D(与全连接层相同)。

    或者,如果你想使用这个确切的代码,在你的 LSTM 层之前添加它,它应该可以工作:

    model1.add(重塑(target_shape=(1,54*40,32))

    由于 pool_size 为 (3,3),它是 54 和 40。

    【讨论】:

    • 非常感谢。但是,您能否详细说明给出 54*40 的计算?
    • 上述语句抛出错误:“ValueError: total size of new array must be changed”
    • 好吧,我一定是弄错了形状。你能告诉我你的密集算子的输出大小吗?
    • 请检查更新的问题。我添加了 model.summary() 结果的图片。
    • 我很困惑...你希望你的 LSTM 层迭代什么?
    猜你喜欢
    • 2019-06-04
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2019-04-14
    • 2018-09-25
    • 2017-11-18
    相关资源
    最近更新 更多