问题描述
我为我的学校作业建立了以下对象识别模型,以便根据CIFAR-10数据集预测班级。分配要求我对所有卷积和池化层使用VALID填充。
def _build_cifar10_model(num_C1_channels=50,num_C2_channels=60,use_dropout=False):
model = Sequential()
# reshape 1D array of length 3072
# to a matrix of shape 32x32x3
model.add(Input(shape=(3072,)))
model.add(Reshape(target_shape=(32,32,3),input_shape=(3072,)))
# 24x24x3
model.add(Conv2D(filters=num_C1_channels,kernel_size=(9,9),padding='valid',activation='relu'))
# 12x12x3
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,padding='valid'))
# 8x8x3
model.add(Conv2D(filters=num_C2_channels,kernel_size=(5,5),activation='relu'))
# 4x4x3
model.add(MaxPooling2D(pool_size=(2,padding='valid'))
model.add(Flatten())
model.add(Dense(units=300))
if use_dropout:
model.add(Dropout(rate=0.5))
model.add(Dense(units=10,activation='softmax'))
if use_dropout:
model.add(Dropout(rate=0.5))
return model
但是,构建此模型会引发以下错误:
InvalidArgumentError: Negative dimension size caused by subtracting 1 from 0 for '{{node max_pooling2d_15/MaxPool}} = MaxPool[T=DT_FLOAT,data_format="NHWC",ksize=[1,2,1],padding="VALID",strides=[1,1]](conv2d_23/Relu)' with input shapes: [?,24,0].
我认为这是因为,当填充为有效时,在将第一个Conv2D图层上应用了kernel_size=9
之后,(32,32,3)图像的大小变为(24,24,0)。不确定为什么RGB通道会完全丢失。
在保持VALID填充的同时,有没有办法解决此问题?
对不起,因为这是我第一次构建这样的模型。
解决方法
在模型开始时使用InputLayer
代替Input
。它将为您提供模型的第一层而不是符号张量。
用以下内容替换行:
model.add(InputLayer(input_shape=(3072,)))
其余的代码似乎对我来说执行了,并在卷积之后为我提供了一个4x4的层,将其输入到辍学/密集层中。