密集层可能会产生InvalidArgumentError:不兼容的形状:[0,2]与[32,2]



的设置

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


参数/模型

我有训练数据:形状为(4599, 124, 124, 3)print(xtrain.shape)并且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)

我的模型是基本的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"])

当我现在适合模型时

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或其他一起使用时,模型会进行训练,但在历元结束时会出现以下错误

ValueError:输入0与层模型_2不兼容:应为形状=(无,224,224,3),找到的形状=(1,124,124,3)

如果我使用高于1的batch_size,例如32和loss=categorical_crossentropy,则在训练前抛出错误:

InvalidArgumentError:不兼容的形状:[32]与[0][[node相等(定义于:12)]][操作:__推理_训练_功能_65107]

使用loss=mse

InvalidArgumentError:不兼容的形状:[0,2]与[32,2][[nodegradient_tape/mean_squared_error/BroacastGradientArgs(定义于:12)]][操作:__推理_训练_功能_81958]

如果我更改最后一个密集层的隐藏单位,错误将更改为该单位。例如

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

中的结果

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

显然,正确的输入形状有时会丢失。尤其是批量大小(第二个维度基于密集的隐藏单元)。有人有主意吗?感谢

我在git上查看了这个旧帖子中的许多回复:https://github.com/kuza55/keras-extras/issues/7但在那里找不到解决方案。

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

您可以:

  • 用兼容的输入维度加载移动网络

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

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

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

相关内容

  • 没有找到相关文章

最新更新