pytorch学习 | 提取参数及自定义初始化

2021 年 12 月 21 日 极市平台
↑ 点击 蓝字  关注极市平台

作者 | 李元芳@知乎 
来源 | https://zhuanlan.zhihu.com/p/52297770 
编辑 | 极市平台

极市导读

 

pytorch实践中,有时提取出的层结构并不够,还需要对里面的参数进行初始化,那么如何提取出网络的参数并对其初始化呢?>>加入极市CV技术交流群,走在计算机视觉的最前沿

有时候提取出的层结构并不够,还需要对里面的参数进行初始化,那么如何提取出网络的参数并对其初始化呢?

首先 nn.Module 里面有两个特别重要的关于参数的属性,分别是 named_parameters()和 parameters()。named_parameters() 是给出网络层的名字和参数的迭代器,parameters()会给出一个网络的全部参数的选代器。

import os
import torch
import torch.nn as nn
import torch.optim as optim
import torch.backends.cudnn as cudnn
import torch.nn.init as init
import argparse
import torch.autograd.variable as variable

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN,self).__init__()  #b,3,32,32
        layer1=nn.Sequential()
        layer1.add_module('conv1',nn.Conv2d(in_channels=3,out_channels=32,kernel_size=3,stride=1,padding=1))
        #b,32,32,32
        layer1.add_module('relu1',nn.ReLU(True))
        layer1.add_module('pool1',nn.MaxPool2d(2,2))
        #b,32,16,16
        self.layer1=layer1
        layer2=nn.Sequential()
        layer1.add_module('conv2',nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,stride=1,padding=1))
        #b,64,16,16
        layer2.add_module('relu2',nn.ReLU(True))
        layer2.add_module('pool2',nn.MaxPool2d(2,2))
        #b,64,8,8
        self.layer2=layer2

        layer3=nn.Sequential()
        layer3.add_module('conv3', nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3 ,stride=1, padding = 1)) 
        #b,128,8,8
        layer3.add_module('relu3', nn.ReLU(True))
        layer3.add_module('poo13', nn.MaxPool2d(22))#b,128,4,4
        self.layer3=layer3

        layer4 =nn.Sequential()
        layer4.add_module('fc1',nn.Linear(in_features=2048, out_features=512 ))
        layer4.add_module('fc_relu1', nn.ReLU(True))
        layer4.add_module('fc2 ', nn.Linear(in_features=512, out_features=64 ))
        layer4.add_module('fc_relu2', nn.ReLU(True))
        layer4.add_module('fc3', nn.Linear(6410))
        self.layer4 = layer4

    def forward(self,x):
        conv1=self.layer1(x)
        conv2=self.layer2(conv1)
        conv3=self.layer3(conv2)
        fc_input=conv3.view(conv3.size(0),-1)
        fc_output=self.layer4(fc_input)
    return fc_output
model=SimpleCNN()
for param in model.named_parameters():
    print(param[0])

可以得到每一层参数的名字,输出为

如何对权重做初始化呢 ? 非常简单,因为权重是一个 Variable ,所以只需要取出其中的 data 属性,然后对它进行所需要的处理就可以了。

for m in model.modules():
    if isinstance(m,nn.Conv2d):
        init.normal(m.weight.data) #通过正态分布填充张量
        init.xavier_normal(m.weight.data) 
#xavier均匀分布的方法来init,来自2010年的论文“Understanding the difficulty of training deep feedforward neural networks”
        init.kaiming_normal(m.weight.data) 
#来自2015年何凯明的论文“Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification”
        m.bias.data.fill_(0)
    elif isinstance(m,nn.Linear):
        m.weight.data.normal_()

通过上面的操作,对将卷积层中使用 PyTorch 里面提供的方法的权重进行初始化,这样就能够使用任意我们想使用的初始化,甚至我们可以自己定义初始化方法并对权重进行初始化 。

更多初始化方法参考【torch.nn.init】https://pytorch-cn.readthedocs.io/zh/latest/package_references/nn_init/

如果觉得有用,就请分享到朋友圈吧!

△点击卡片关注极市平台,获取 最新CV干货

公众号后台回复“transformer”获取最新Transformer综述论文下载~


极市干货
课程/比赛: 珠港澳人工智能算法大赛 保姆级零基础人工智能教程
算法trick 目标检测比赛中的tricks集锦 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks
技术综述: 一文弄懂各种loss function 工业图像异常检测最新研究总结(2019-2020)


CV技术社群邀请函 #

△长按添加极市小助手
添加极市小助手微信(ID : cvmart4)

备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳)


即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群


每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~



觉得有用麻烦给个在看啦~   
登录查看更多
0

相关内容

专知会员服务
7+阅读 · 2021年10月4日
专知会员服务
51+阅读 · 2021年6月17日
如何构建你的推荐系统?这份21页ppt教程为你讲解
专知会员服务
64+阅读 · 2021年2月12日
迁移学习简明教程,11页ppt
专知会员服务
106+阅读 · 2020年8月4日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
Keras François Chollet 《Deep Learning with Python 》, 386页pdf
专知会员服务
144+阅读 · 2019年10月12日
强化学习最新教程,17页pdf
专知会员服务
168+阅读 · 2019年10月11日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
pytorch提取参数及自定义初始化
极市平台
0+阅读 · 2022年4月13日
详解PyTorch中的ModuleList和Sequential
极市平台
0+阅读 · 2022年1月28日
pytorch优化器与学习率设置详解
极市平台
1+阅读 · 2022年1月3日
pytorch中六种常用的向量相似度评估方法
极市平台
21+阅读 · 2021年12月9日
PyTorch 深度剖析:如何保存和加载PyTorch模型?
极市平台
0+阅读 · 2021年11月28日
详解PyTorch编译并调用自定义CUDA算子的三种方式
极市平台
0+阅读 · 2021年11月6日
PyTorch 学习笔记(四):权值初始化的十种方法
极市平台
14+阅读 · 2019年5月1日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2010年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Arxiv
0+阅读 · 2022年4月19日
Arxiv
0+阅读 · 2022年4月18日
Arxiv
22+阅读 · 2018年8月30日
Arxiv
19+阅读 · 2018年3月28日
VIP会员
相关VIP内容
专知会员服务
7+阅读 · 2021年10月4日
专知会员服务
51+阅读 · 2021年6月17日
如何构建你的推荐系统?这份21页ppt教程为你讲解
专知会员服务
64+阅读 · 2021年2月12日
迁移学习简明教程,11页ppt
专知会员服务
106+阅读 · 2020年8月4日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
Keras François Chollet 《Deep Learning with Python 》, 386页pdf
专知会员服务
144+阅读 · 2019年10月12日
强化学习最新教程,17页pdf
专知会员服务
168+阅读 · 2019年10月11日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
相关资讯
pytorch提取参数及自定义初始化
极市平台
0+阅读 · 2022年4月13日
详解PyTorch中的ModuleList和Sequential
极市平台
0+阅读 · 2022年1月28日
pytorch优化器与学习率设置详解
极市平台
1+阅读 · 2022年1月3日
pytorch中六种常用的向量相似度评估方法
极市平台
21+阅读 · 2021年12月9日
PyTorch 深度剖析:如何保存和加载PyTorch模型?
极市平台
0+阅读 · 2021年11月28日
详解PyTorch编译并调用自定义CUDA算子的三种方式
极市平台
0+阅读 · 2021年11月6日
PyTorch 学习笔记(四):权值初始化的十种方法
极市平台
14+阅读 · 2019年5月1日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2010年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Top
微信扫码咨询专知VIP会员