当我尝试为迁移学习任务加载自己的权重时,我得到了ValueError

2024-04-20 06:55:01 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试在Keras中进行迁移学习,我正在尝试将重量加载到一个新模型中,我已经从不同的任务中进行了自我训练

我从另一项任务中训练了自己的一套重量。然而,另一个任务是二进制分类问题,而我的新问题是多标签分类问题

我的第一组砝码是这样做的:

n_classes = 1
epochs = 100
batch_size = 32
input_shape = (224, 224, 3)

base_model = MobileNetV2(input_shape=input_shape, weights= None, include_top=False)
x = GlobalAveragePooling2D()(base_model.output)

output = Dense(n_classes, activation='sigmoid')(x)
model = tf.keras.models.Model(inputs=[base_model.input], outputs=[output])

opt = optimizers.Adam(lr = 0.001)

model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])

...
...

history = model.fit(train_generator, epochs=epochs, 
                    steps_per_epoch=step_size_train,verbose=1,
                    validation_data=valid_generator,
                    validation_steps=STEP_SIZE_VALID,
                    class_weight=class_weights,
                    )


model.save_weights("initial-weights.h5")


但当我尝试将这些权重加载到我的新模型中时:

weights_path = 'initial-weights.h5'

n_classes = 14
epochs = 1000
batch_size = 32
input_shape = (224, 224, 3)

base_model = MobileNetV2(input_shape=input_shape, weights= None, include_top=False)
x = GlobalAveragePooling2D()(base_model.output)


output = Dense(n_classes, activation='sigmoid')(x)
model = tf.keras.models.Model(inputs=[base_model.input], outputs=[output])

opt = optimizers.Adam(lr = 0.001)

model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])

model.load_weights(weights_path)

我得到以下错误:

ValueError: Shapes (1280, 14) and (1280, 1) are incompatible

我理解,根据错误,很可能是由于班级数量的不同,但根据我对迁移学习的了解,即使班级数量不同,也有可能从不同的任务中迁移权重(例如,不同班级数量的任务如何使用ImageNet权重)

如何初始化自己的自定义权重集,这些权重是从具有不同类数的不同任务中训练出来的


Tags: 模型inputoutputbasesize数量modelclasses
1条回答
网友
1楼 · 发布于 2024-04-20 06:55:01

我认为最好的方法是转移除最后一层(即特征提取部分)之外的所有层的权重。然后,您可以冻结所有传输的权重,并再次训练模型,其中仅训练最后一层(即分类层)上的权重

相关问题 更多 >