【问题标题】:Input 0 of layer lstm_9 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 300, 300, 1]层 lstm_9 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[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 中图像的输入维度进行非常小的更改。能否请您更改相同的代码。

【问题讨论】:

    标签: python keras


    【解决方案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制作
    猜你喜欢
    • 2020-08-13
    • 2020-11-15
    • 2021-01-14
    • 1970-01-01
    • 2021-04-09
    • 2020-08-11
    • 2021-03-22
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多