ValueError:连续图层50的输入0与该图层不兼容::预期的min_ndim = 4,找到的ndim = 3。收到完整的图形:[无,224,224]

时间:2020-08-06 07:55:53

标签: python tensorflow keras deep-learning

我一直在收到此错误。如果添加(无,IMG_SIZE,IMG_SIZE,1),则会出现此错误。如果我删除(IMG_SIZE,IMG_SIZE,1)'none',则会出现编译时错误。我看到其他人有类似的问题,原因各不相同。任何帮助将不胜感激。谢谢!

def convolutional_model():
    
    from keras.utils import to_categorical
    from keras.models import Sequential
    from keras.layers import Conv2D
    from keras.layers import MaxPooling2D
    from keras.layers import Dense
    from keras.layers import Flatten
    from keras.optimizers import SGD
    from keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.optimizers import RMSprop
    from keras.layers import Dropout
    from tensorflow import keras
    
    # create model
    model = Sequential()
#     model.add(keras.Input(shape=(None, IMG_SIZE, IMG_SIZE, 1)))
#     Convolutional layer 1 with 32 filters of kernel size[5,5] 
    model.add(Conv2D(filters=32, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 1)))
#     Pooling layer 1 with pool size[2,2] and stride 2 
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
    
#     Convolutional layer 2 with 64 filters of kernel size[5,5] 
    model.add(Conv2D(64, (5, 5), strides=(1, 1), activation='relu'))
#  Pooling layer 2 with pool size[2,2] and stride 2 
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

    model.add(Flatten())
    
#     Dense layer whose output size is fixed in the hyper parameter: 
    model.add(Dense(units=32, activation='relu'))
    
#     Dropout layer with dropout probability 0.4 
    model.add(Dropout(0.4))


    
#     units is 2 because we have 2 classes to predict (cot or dog)
    model.add(Dense(units=2, activation='softmax'))
    
    # Compile model
#     model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    # compile model
    model.compile(
             optimizer=RMSprop(lr=0.001),
             loss='binary_crossentropy',
             metrics=['accuracy'])
    return model

enter image description here

拟合模型

history = model.fit(x_train, steps_per_epoch=len(x_train),
validation_data=x_test, validation_steps=len(x_test), epochs=3, verbose=2)

ValueError:layer_50的输入0与该图层不兼容::预期的min_ndim = 4,找到的ndim = 3。收到完整的图形:[无,224,224]

2 个答案:

答案 0 :(得分:3)

您需要添加渠道维度。 Keras 需要这种数据格式:

(n_samples, height, width, channels)

例如,如果您的图像是灰度图像,则它们有 1 个通道,因此需要以这种格式将它们提供给 Keras:

(60000, 28, 28, 1)

不幸的是,灰度图片通常会在没有通道维度的情况下提供/下载,例如在 tf.keras.datasets.mnist.load_data 中,这将是 (60000, 28, 28),这是有问题的。

解决方案:

您可以使用 tf.expand_dims 添加维度

xtrain = tf.expand_dims(xtrain, axis=-1)

现在您的输入形状将是:

(60000, 28, 28, 1)

还有其他替代方案可以做同样的事情:

xtrain = xtrain[..., np.newaxis]
xtrain = xtrain[..., None]
xtrain = xtrain.reshape(-1, 28, 28, 1)
xtrain = tf.reshape(xtrain, (-1, 28, 28, 1))
xtrain = np.expand_dims(xtrain, axis=-1)

答案 1 :(得分:2)

您创建的模型的输入层需要使用4维张量,但传递给它的x_train张量只有3维

这意味着您必须使用.reshape(n_images,286,384,1)重塑训练集。现在,您添加了一个额外的维度,而无需更改数据,并且模型可以运行了。

在训练模型之前,您需要将x_train张量重塑为4维。 例如:

x_train = x_train.reshape(-1, 224, 224, 1)

有关keras输入Check this answer

的更多信息