PyTorch学习系列(十)——如何在训练时固定一些层?
来源:互联网 发布:mac os x 镜像 编辑:程序博客网 时间:2024/05/17 23:57
有时我们会用其他任务(如分类)预训练好网络,然后固定卷积层作为图像特征提取器,然后用当前任务的数据只训练全连接层。那么PyTorch如何在训练时固定底层只更新上层呢?这意味着我们希望反向传播计算梯度时,我们只希望计算到最上面的卷积层,对于卷积层,我们并不希望计算梯度并用梯度来更新参数。
我们知道,网络中的所有操作对象都是Variable对象,而Variable有两个参数可以用于这个目的:requires_grad和volatile。
requires_grad=False
在用户手动定义Variable时,参数requires_grad默认值是False。而在Module中的层在定义时,相关Variable的requires_grad参数默认是True。
在计算图中,如果有一个输入的requires_grad是True,那么输出的requires_grad也是True。只有在所有输入的requires_grad都为False时,输出的requires_grad才为False。
>>>x = Variable(torch.randn(2, 3), requires_grad=True)>>>y = Variable(torch.randn(2, 3), requires_grad=False)>>>z = Variable(torch.randn(2, 3), requires_grad=False)>>>out1 = x+y>>>out1.requires_gradTrue>>>out2 = y+z>>>out2.requires_grad False
在训练时如果想要固定网络的底层,那么可以令这部分网络对应子图的参数requires_grad为False。这样,在反向过程中就不会计算这些参数对应的梯度:
model = torchvision.models.resnet18(pretrained=True)for param in model.parameters():#nn.Module有成员函数parameters() param.requires_grad = False# Replace the last fully-connected layer# Parameters of newly constructed modules have requires_grad=True by defaultmodel.fc = nn.Linear(512, 100)#resnet18中有self.fc,作为前向过程的最后一层。# Optimize only the classifieroptimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)#optimizer用于更新网络参数,默认情况下更新所有的参数
volatile=True
Variable的参数volatile=True和requires_grad=False的功能差不多,但是volatile的力量更大。当有一个输入的volatile=True时,那么输出的volatile=True。volatile=True推荐在模型的推理过程(测试)中使用,这时只需要令输入的voliate=True,保证用最小的内存来执行推理,不会保存任何中间状态。
>>> regular_input = Variable(torch.randn(5, 5))>>> volatile_input = Variable(torch.randn(5, 5), volatile=True)>>> model = torchvision.models.resnet18(pretrained=True)>>> model(regular_input).requires_grad #输出的requires_grad应该是True,因为中间层的Variable的requires_grad默认是TrueTrue>>> model(volatile_input).requires_grad#输出的requires_grad是False,因为输出的volatile是True(等价于requires_grad是False)False>>> model(volatile_input).volatileTrue
阅读全文
0 0
- PyTorch学习系列(十)——如何在训练时固定一些层?
- PyTorch学习系列(十五)——如何加载预训练模型?
- PyTorch学习系列(十六)——如何使用cuda进行训练?
- Pytorch学习系列(八)——训练神经网络
- PyTorch学习系列(十四)——保存训练好的模型
- PyTorch学习—PyTorch是什么?
- pytorch 使用预训练层
- pytorch学习1:如何加载自己的训练数据
- PyTorch学习系列(三)——构建神经网络
- PyTorch学习系列(六)——自动求导
- PyTorch学习系列(四)——Tensor 和 Variable
- PyTorch学习系列(五)——自定义loss
- PyTorch学习系列(二)——数据预处理torchvision.transforms
- PyTorch学习系列(九)——参数_定义
- PyTorch学习系列(九)——参数_初始化
- PyTorch代码学习-ImageNET训练
- PyTorch学习之路(level1)——训练一个图像分类模型
- 基于PyTorch的深度学习入门教程(五)——训练神经网络分类器
- Qt配置pro文件以及第三方库
- measurechildren的工作原理
- html5<canvas操作像素之添加杂色,动态倒影逐行显示>
- 用make-kpkg制作ubuntu的内核安装包deb
- 集合
- PyTorch学习系列(十)——如何在训练时固定一些层?
- 面试中遇到过的闭包~
- Java深入——Java 内存分配和回收机制
- ubuntu-换源
- Ksoap-android 编程案例
- jquery-ui datepicker日历的灵活运用日期背景色定义,选择日期显示数据
- Bootstrap支持多模态框
- tf.nn.embedding_lookup函数的用法
- js中怎么根据数组对象中的两个属性来取第三个属性的值