我一直在收到此错误。如果添加(无,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
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]
答案 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
的更多信息