嗨,我正在尝试在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权重)
如何初始化自己的自定义权重集,这些权重是从具有不同类数的不同任务中训练出来的
我认为最好的方法是转移除最后一层(即特征提取部分)之外的所有层的权重。然后,您可以冻结所有传输的权重,并再次训练模型,其中仅训练最后一层(即分类层)上的权重
相关问题 更多 >
编程相关推荐