Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通过Resnet预训练模型提升图像分类模型精度 #142

Open
leewishyuanfang opened this issue Jun 25, 2019 · 4 comments
Open

通过Resnet预训练模型提升图像分类模型精度 #142

leewishyuanfang opened this issue Jun 25, 2019 · 4 comments

Comments

@leewishyuanfang
Copy link
Contributor

leewishyuanfang commented Jun 25, 2019

在本次实践中,将通过resnet预训练模型来进行猫狗图像识别的模型训练。
相比之前实验中采用的VGG16网络,resnet网络要更加复杂,模型的参数数量要更多,如果仅通过已有的25000张图片来训练resnet网络,是远远不够的,幸运的是,resnet网络也提供了若干预训练模型,来加速网络的训练和提升精度。
所谓的预训练模型,就是实现使用大型的图像分类数据集完成了对模型的训练,并将训练后的模型参数保存下来。在我们的训练过程中,就可以在创建模型时直接导入这些已经训练好的模型参数,然后再对模型的某些层展开训练(这里一般指的是模型最后的全连接层)。
采用预训练模型,能够充分利用模型在大型数据集上已经提取出来的图像特征,使得即便只有少量的训练数据,也能够达到很高的训练精度,训练速度也大大提高。
接下来。我们就对我们的程序进行改造,具体代码如下:
只需将原有程序中模型创建的这部分代码:

vgg创建

改为以下代码:
首先,添加ResNet50依赖
from keras.applications.resnet50 import ResNet50
接下来,导入预训练模型
base_model = ResNet50(weights='imagenet', include_top=False, pooling=None, input_shape=(ROWS, COLS, CHANNELS), classes=2)
然后,冻结base_model所有层,这样在训练时,这些层的参数不会再参与训练
for layer in base_model.layers:
layer.trainable = False
x = base_model.output
接下来,添加自己的全链接分类层
x = Flatten()(x)
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)
最终,获得最终模型
model = Model(inputs=base_model.input, outputs=predictions)
在这里,我们采用的是resnet在imagenet这个数据集上训练得到的预训练模型。Imagenet数据集有1400多万幅图片,涵盖2万多个类别。当使用ResNet50()导入模型时,程序会自动联网到github上下载预训练模型(这里我得吐槽一句,为啥我在本机直接从github上下载预训练模型就只有不到15kb的下载速度,而NoteBook就几乎是瞬间下载…)。
程序的其他部分不变,我们再次展开实验

resnet训练精度

我们可以发现,模型在训练集和验证集上的精度,均得到了极大提高
最终,在测试集上的精度如下:

resnet测试精度

可以看到,最终的模型在测试集上的分类精度高达96%,几乎是完美完成了分类任务。
由此,可以总结如下:采用常用模型的预训练模型,可以大大缩短模型训练的时间,提高模型的精度。在训练数据不充分,计算资源和开发时间有限的情况下,采用预训练模型是我们的最佳选择。

leewishyuanfang added a commit to leewishyuanfang/ModelArts-Lab that referenced this issue Jun 25, 2019
* leewishyuanfang:4个积分,贡献点:
     * 完成案例:[手写数字案例](https://github.com/huaweicloud/ModelArts-Lab/issues/4),[第一期](https://github.com/huaweicloud/ModelArts-Lab/issues/49#issuecomment-503563468),[第二期](https://github.com/huaweicloud/ModelArts-Lab/issues/113#issuecomment-504765824)
     * 体验文章:
     * 扩展案例:[第二期扩展实践:提升模型精度的几种尝试](huaweicloud#142)
     * 实际应用案例:
@leewishyuanfang leewishyuanfang changed the title 【实战营】第二期扩展实践:提升模型精度的几种尝试 【实战营】第二期扩展实践:通过Resnet预训练模型提升模型精度 Jun 25, 2019
@leewishyuanfang leewishyuanfang changed the title 【实战营】第二期扩展实践:通过Resnet预训练模型提升模型精度 通过Resnet预训练模型提升图像分类模型精度 Jun 25, 2019
@chenliang613
Copy link
Collaborator

赞!请把此经验提交一个PR到/contrib下,文件夹名字: 《第二期猫狗识别率调到96%-leewishyuanfang》

我的意见:这个分享,可以积3分,请其他committer看下。

@chaoxu1203
Copy link
Collaborator

chaoxu1203 commented Jun 26, 2019

这个思路很好,讲解也很清晰,赞!
(ModelArts Notebook下载数据速度快是因为华为云的网络性能强劲,哈哈)

@crystaldust
Copy link
Contributor

@leewishyuanfang Hi, 请问可以提供一个你运行好的,带结果的ipynb文件吗?我们来复现、确认一下结果

@leewishyuanfang
Copy link
Contributor Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants