的设置
我使用的是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=1
与loss=mse
、categorical_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
,我建议你先做。