繁体   English   中英

密集层可能会产生 InvalidArgumentError: Incompatible shapes: [0,2] vs. [32,2]

[英]Dense layer probably produces InvalidArgumentError: Incompatible shapes: [0,2] vs. [32,2]

设置

我在 Azure DSVM STANDARD_NC6(6 核,56 GB RAM,380 GB 磁盘)上使用 Python 3.6、TF 2.4.0,使用 1 Z432F9EC2173072


参数/型号

我有训练数据: print(xtrain.shape)形状为(4599, 124, 124, 3)和 ytrain | yval 作为分类。

我使用经典生成器

datagen = ImageDataGenerator(
    zoom_range=0.1,
    rotation_range=25,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.15,
    horizontal_flip=True,
    fill_mode="nearest"
    )

datagen.fit(xtrain)

而我的 model 是具有自己头部的基本 mobilenetv2:

baseModel = MobileNetV2(weights="imagenet", 
                        include_top=False, 
                        input_tensor=Input(shape=(224, 224,3)), 
                        #input_shape=(224, 224, 3),
                        )

headModel = baseModel.output
headModel = AveragePooling2D(pool_size=(7, 7))(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(64, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(2, activation="softmax")(headModel)

model = Model(inputs=baseModel.input, outputs=headModel)

for layer in baseModel.layers:
    layer.trainable = False

model.compile(loss="mse", optimizer='adam', metrics=["accuracy"])

当我现在安装 model

Batch_Size=1

h = model.fit(
datagen.flow(xtrain, ytrain, batch_size=Batch_Size),
steps_per_epoch=len(xtrain) // Batch_Size,
validation_data=(xval, yval),
validation_steps=len(xval) // Batch_Size,
epochs=EPOCHS,
callbacks=[model_checkpoint_callback, Board])

错误

我得到错误(都一样,但随着批量大小和损失函数而变化)

当我将batch_size=1loss=msecategorical_crossentropy或其他一起使用时,model 训练但在纪元结束时抛出以下错误

ValueError: Input 0 is in compatible with layer model_2: expected shape=(None, 224, 224, 3), found shape=(1, 124, 124, 3)

如果 II 使用大于 1 的batch_size ,例如 32 且loss=categorical_crossentropy ,则在训练之前会抛出错误:

InvalidArgumentError:不兼容的形状: [32] vs. [0] [[node Equal (defined at:12)]] [Op:__inference_train_function_65107]

loss=mse

InvalidArgumentError:不兼容的形状: [0,2] 与 [32,2] [[node gradient_tape/mean_squared_error/BroadcastGradientArgs(定义于:12)]] [Op:__inference_train_function_81958]

如果我更改最后一个密集层的隐藏单位,错误就会改变。 例如

...
headModel = Dense(5, activation="softmax")(headModel)

结果是

InvalidArgumentError:不兼容的形状: [0,5] 与 [32,2]

显然,正确的输入形状在某处丢失了。 尤其是批量大小(第二维基于密集的隐藏单元)。 有人有想法吗? 谢谢

我在 git: https://github.com/kuza55/keras-extras/issues/7上检查了这个旧线程的许多答案,但在那里找不到解决方案。

您提供给网络的数据必须具有与网络输入相同的形状。 您正在尝试为接受尺寸为124x124x3的图像的网络提供尺寸为224x224x3的数据。

您可以:

  • 使用兼容的输入维度加载 mobilenet 网络

    baseModel = MobileNetV2(weights=None, include_top=False, input_tensor=Input(shape=(124, 124,3)), )

    这种方法的缺点是不能使用预训练的权重。

  • 将输入数据重塑为 model 输入的大小。 在这种情况下,将124xx124图像的大小调整为224x224 有很多方法可以做到,但如果你愿意保留ImageDataGenerator ,我建议你提前做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM