【pytorch】微调技术

28 篇文章 0 订阅
21 篇文章 0 订阅

前言

训练神经网络是一件非常耗费时间的事情,其需要大量的算力以及大量的数据。显然从头开始训练并不是明智之选,利用好已有的资源才是明智之选。

微调技术

图像识别笼统地可以分为两步:

  1. 提取图片的特征,此部分往往通过CNN卷积神经网络实现。
  2. 根据提取的特征,进行分类,此部分往往通过全连接神经网络来实现。
  • 识别一只猫和识别一只狗有没有类似的地方呢?
    答案是有的,它们在提取图片特征都是非常相似的。
    考虑CNN中卷积的作用,它就是在识别不同的边缘,因此无论是猫,还是狗,图片特征都是类似的,但是如何根据这些特征来学习才是关键。

预训练模型

在图像识别中,有许多经典的神经网络,例如vgg,resnet等,对于这些经典的网络,pytorch都是提供了训练模型好的模型的。这些某些都是在ImageNet上训练好的,有较高的精确度。利用训练好的某些进行图片特征的提取,就能够大大减少训练的耗时。

代码实现

import torch
from torch import nn
from torch.nn import functional as F
from torchsummary import summary

net = torchvision.models.resnet18(pretrained=True)
    
net.fc = nn.Linear(net.fc.in_features, 5)
nn.init.xavier_uniform_(net.fc.weight)
summary(net , input_size=(3,224,224) , device="cpu")

lr = 0.0005
loss = nn.CrossEntropyLoss(reduction="mean")

params_1x = [param for name, param in net.named_parameters()
    if name not in ["fc.weight", "fc.bias"]]
trainer = torch.optim.SGD([{'params': params_1x},{'params': net.fc.parameters(),'lr': lr * 80}],lr=lr, weight_decay=0.001)
epochs = 15

其实非常简单,甚至比自己完全手动定义神经网络都简单,因为它完全不需要自己定义网络结构。
但是这些与训练模型并不是能够直接拿过来就能使用的,还需要一些修改:

  1. 修改最后的类别数
    在ImageNet中,其最后的全连接层是一个输出为 1000 1000 1000的向量,也就是代表着 1000 1000 1000个类别,在实际中,需要根据当前识别认为的类别数进行修改。
  2. 学习率
    一般来说,预训练好的参数无需修改,可以将其设为无需学习的参量,也可以将其的学习率设置的非常小。而对于最后的全连接层,也就是对提取出来的图片信息进行分类的网络,其学习率就要比较大了。

作用与意义

微调技术可谓是没有足够算力人的福音了,其大大减少了训练的成本。

  1. 提取图像特征的CNN网络往往更加靠近输入,通过梯度反向传播进行训练,往往需要比靠近输出的全连接网络更耗费时间。
  2. 利用微雕技术,可以在极短的时间内得到一个非常好的结果,在5轮迭代之后就已经可以达到91%的正确率了;15轮迭代就能达到97%的正确率。
    在这里插入图片描述

不足与局限性

并不是所有情况都能使用微调技术的,在图片特征出现显著差异的时候,使用微调技术往往不能得到满意的结果。
比如,在ImageNet上训练的模型都是基于正常图片的,但是如果将它用于识别医学影像(X光片等)就会导致失败。同样用这个模型去识别卡通图片也往往会识别。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值