为了账号安全,请及时绑定邮箱和手机立即绑定

ResNet50 模型在 keras 中没有通过迁移学习进行学习

ResNet50 模型在 keras 中没有通过迁移学习进行学习

慕的地6264312 2022-06-22 20:42:23
我正在尝试对在 PASCAL VOC 2012 数据集的 Imagenet 权重上预训练的 ResNet50 模型执行迁移学习。由于它是一个多标签数据集,我sigmoid在最后一层使用激活函数和binary_crossentropy损失。指标是precision,recall and accuracy。下面是我用来为 20 个类构建模型的代码(PASCAL VOC 有 20 个类)。img_height,img_width = 128,128num_classes = 20#If imagenet weights are being loaded,#input must have a static square shape (one of (128, 128), (160, 160), (192, 192), or (224, 224))base_model = applications.resnet50.ResNet50(weights= 'imagenet', include_top=False, input_shape= (img_height,img_width,3))x = base_model.outputx = GlobalAveragePooling2D()(x)#x = Dropout(0.7)(x)predictions = Dense(num_classes, activation= 'sigmoid')(x)model = Model(inputs = base_model.input, outputs = predictions)for layer in model.layers[-2:]:        layer.trainable=Truefor layer in model.layers[:-3]:        layer.trainable=Falseadam = Adam(lr=0.0001)model.compile(optimizer= adam, loss='binary_crossentropy', metrics=['accuracy',precision_m,recall_m])#print(model.summary())X_train, X_test, Y_train, Y_test = train_test_split(x_train, y, random_state=42, test_size=0.2)savingcheckpoint = ModelCheckpoint('ResnetTL.h5',monitor='val_loss',verbose=1,save_best_only=True,mode='min')earlystopcheckpoint = EarlyStopping(monitor='val_loss',patience=10,verbose=1,mode='min',restore_best_weights=True)model.fit(X_train, Y_train, epochs=epochs, validation_data=(X_test,Y_test), batch_size=batch_size,callbacks=[savingcheckpoint,earlystopcheckpoint],shuffle=True)model.save_weights('ResnetTLweights.h5')它运行了 35 个 epoch,直到 earlystopping,指标如下(没有 Dropout 层):我发现验证集的准确率和召回率与带有和不带有 dropout 层的训练集相比非常低。我该如何解释这个?这是否意味着模型过度拟合。如果是这样,我该怎么办?截至目前,模型预测是相当随机的(完全不正确)。数据集大小为 11000 张图像。
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

请您修改如下代码并尝试执行

从:

predictions = Dense(num_classes, activation= 'sigmoid')(x)

至:

predictions = Dense(num_classes, activation= 'softmax')(x)

从:

model.compile(optimizer= adam, loss='binary_crossentropy', metrics=['accuracy',precision_m,recall_m])

至:

model.compile(optimizer= adam, loss='categorical_crossentropy', metrics=['accuracy',precision_m,recall_m])


查看完整回答
反对 回复 2022-06-22
?
慕森王

TA贡献1777条经验 获得超3个赞

这个问题已经很老了,但如果它对其他人有帮助,我会回答它:

在此示例中,您冻结了除最后两个层(全局平均池化和最后一个密集层)之外的所有层。有一种更简洁的方法可以达到相同的状态:

rn50 = applications.resnet50.ResNet50(weights='imagenet', include_top=False, input_shape=(img_height, img_width, 3))x = rn50.outputx = GlobalAveragePooling2D()(x)predictions = Dense(num_classes, activation= 'sigmoid')(x)model = Model(inputs = base_model.input, outputs = predictions)rn50.trainable = False  # <- thismodel.compile(...)

在这种情况下,从 ResNet50 网络中提取特征并馈送到线性 softmax 分类器,但没有训练 ResNet50 的权重。这称为特征提取,而不是微调。

唯一正在训练的权重来自您的分类器,该分类器是用从随机分布中提取的权重实例化的,因此应该完全训练。您应该使用 Adam 的默认学习率:

model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.001))

所以你可以训练它几个时期,一旦完成,你就可以解冻主干并“微调”它:

backbone.trainable = Falsemodel.compile(optimizer=tf.optimizers.Adam(learning_rate=0.001))model.fit(epochs=50)backbone.trainable = Truemodel.compile(optimizer=tf.optimizers.Adam(learning_rate=0.00001))model.fit(epochs=60, initial_epoch=50)

Keras 网站上有一篇很好的文章:https ://keras.io/guides/transfer_learning/


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号