![](/img/trans.png)
[英]Tensorflow 2.2.0 InvalidArgumentError: Incompatible shapes: [98,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=1
与loss=mse
、 categorical_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.