层 lstm_9 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 300, 300, 1]

Posted

技术标签:

【中文标题】层 lstm_9 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 300, 300, 1]【英文标题】:Input 0 of layer lstm_9 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 300, 300, 1] 【发布时间】:2020-09-01 03:20:40 【问题描述】:

代码是在图像数据集上执行的,在执行以下代码时,我得到了值错误。帮助我弄清楚如何修复这个错误。

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

X = np.array(pickle.load(open("X.pickle","rb")))
Y = np.array(pickle.load(open("Y.pickle","rb")))

#scaling our image data
X = X/255.0

model = Sequential()
print(X.shape)
print(Y.shape)
#model.add(Conv2D(64 ,(3,3), input_shape = X.shape[1:]))
model.add(Conv2D(64 ,(3,3), input_shape = X.shape[1:]))
# print(X.shape)
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))
print(X.shape)
print(Y.shape)

model.add(Conv2D(128 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))
print(X.shape)
print(Y.shape)

model.add(Conv2D(256 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))
print(X.shape)
print(Y.shape)

model.add(Conv2D(512 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))
print(X.shape)
print(Y.shape)

model.add(Flatten())
print(X.shape)
print(Y.shape)

model = Sequential()
model.add(LSTM(128, input_shape=(X.shape[1:]), activation='relu', return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)


model.compile(loss='binary_crossentropy', optimizer=opt,
             metrics=['accuracy'])

model.fit(X, Y, batch_size=32, epochs = 2, validation_split=0.1)

上面的代码产生以下输出。我一次又一次地打印形状,只是为了查看生成的矩阵。 (90, 300, 300, 1) (90,) (90, 300, 300, 1) (90,) (90, 300, 300, 1) (90,) (90, 300, 300, 1) (90,) (90, 300, 300, 1) (90,) (90, 300, 300, 1) (90,)

这里需要根据代码中的错误对第一个 LSTM 中图像的输入维度进行非常小的更改。能否请您更改相同的代码。

【问题讨论】:

【参考方案1】:
model = Sequential()

model.add(Conv2D(64 ,(3,3), input_shape = (300,300,1)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Conv2D(128 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Conv2D(256 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Conv2D(512 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Reshape((16, 16*512)))
model.add(LSTM(128, activation='relu', return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)


model.compile(loss='binary_crossentropy', optimizer=opt,
             metrics=['accuracy'])

model.summary()

【讨论】:

有什么方法可以在一个代码中同时应用 CNN 和 LSTM,因为您建议的只是 CNN,而我想使用它们的混合体? 我编辑了,请不要忘记投票并接受它作为答案 能否请您对上述代码进行更改。我编辑了我的代码。 它工作正常。太感谢了!但是可以打印模型的准确率和混淆矩阵吗? 准确性:model.evaluate(X_test) 而conf矩阵可以用sklearn制作

以上是关于层 lstm_9 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 300, 300, 1]的主要内容,如果未能解决你的问题,请参考以下文章

ValueError: 层 lstm_12 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4

ValueError: 层 lstm_21 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(无,546)

ValueError:lstm_45 层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,无,无,128)

ValueError: 层序号_29 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,22]

ValueError: 层序贯_1 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(无,93)

层“sequential”的输入 0 与层不兼容:预期 shape=(None, 60), found shape=(5, 174)