IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Pytorch 模型参数管理 -> 正文阅读

[人工智能]Pytorch 模型参数管理

Pytorch 模型参数管理

1. 参数初始化

  • 使用 self.modules ,声明网络时初始化并加载权重

pytorch 模型应是 nn.Module 的子类
self.modules: nn.Module 类中的一个方法, 返回该网络中的所有 modules
可以利用 self.modules 来对网络进行初始化。

class Network(nn.Module):
	def __init__(self):
		supe().__init__()
		self.Conv2d = nn.Conv2d(3, 10)
		sefl.bn = nn.BatchNorm2d(10)
		self.relu = nn.ReLU()
		self._init_weight()  #在初始化网络时, 会执行该函数,然后初始化网络中的每个module
		
	def forward(self, x):
		x = self.Conv2d(x)
		x = self.bn(x)
		return self.relu(x)
		
	def _init_weight(self):
		for m in self.modules()   #继承nn.Module的方法
			if isinstance(m, nn.Conv2d):
				torch.nn.init.kaiming_normal_(m.weight)
			elif isinstance(m, nn.BatchNorm2d):
				m.weight.data.fill_(1)
				m.bias.data.zero_()
  • 先定义网络,后加载权重, 使用net.apply()
import torch.nn as nn

class NET(nn.Module):  # 声明网络
'''
 定义网络层
'''
net = NET()  # 定义网络

def weight_init(m):  #初始化权重
    if isinstance(m, nn.Conv3d):
        n = m.kernel_size[0] * m.kernel_size[1] * m.kernel_size[2] * m.out_channels
        m.weight.data.normal_(0, math.sqrt(2.0 / n))
        m.bias.data.zero_()
    elif isinstance(m, nn.BatchNorm3d):
        m.weight.data.fill_(1)
        m.bias.data.zero_()
    elif isinstance(m, nn.Linear):
        m.weight.data.normal_(0, 0.02)
        m.bias.data.zero_()
        
net.apply(weight_init)  # 加载权重

2. 参数访问

从已有的模型中访问参数
通过Module 类的 parameters() 或者named_parameters() 来访问参数

  • 使用 net.named_parameters()
class Net(nn.Modules):
    def __init__(self):
        super(LeNet, self).__init__()
        pass
    def forward(x):
    	pass
		
net = Net()
for name, param in net.named_parameters():
    print(name, '      ', param.size())
# 举个例子(LeNet)
conv.0.weight        torch.Size([6, 1, 5, 5])
conv.0.bias        torch.Size([6])
conv.3.weight        torch.Size([16, 6, 5, 5])
conv.3.bias        torch.Size([16])
fc.0.weight        torch.Size([120, 256])
fc.0.bias        torch.Size([120])
fc.2.weight        torch.Size([84, 120])
fc.2.bias        torch.Size([84])
fc.4.weight        torch.Size([10, 84])
fc.4.bias        torch.Size([10])
  • 使用 net.state_dict()
    当通过Sequential类定义模型时,我们可以通过索引来访问模型的任意层。
    这就像模型是?个列表?样。每层的参数都在其属性中。
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
print(net[2].state_dict())
OrderedDict([('weight', tensor([[-0.0578, 0.2847, 0.0501, -0.1246, 0.2490, -0.0303, 0.1356, 0.2373]])), ('bias', tensor([0.1629]))])

3. 参数共享

有时我们希望在多个层间共享参数。让我们看看如何优雅地做这件事。在下面,我们定义?个稠密层,然后使用它的参数来设置另?个层的参数。

#我们需要给共享层?个名称,以便可以引?它的参数。
shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
shared, nn.ReLU(),
shared, nn.ReLU(),
nn.Linear(8, 1))
net(X)
# 检查参数是否相同
print(net[2].weight.data[0] == net[4].weight.data[0])
net[2].weight.data[0, 0] = 100
# 确保它们实际上是同?个对象,?不只是有相同的值。
print(net[2].weight.data[0] == net[4].weight.data[0])
tensor([True, True, True, True, True, True, True, True])
tensor([True, True, True, True, True, True, True, True])

这个例子表明第?层和第三层的参数是绑定的。它们不仅值相等,而且由相同的张量表示。因此,如果我们改变其中?个参数,另?个参数也会改变。你可能会想,当参数绑定时,梯度会发?什么情况?答案是由于模型参数包含梯度,因此在反向传播期间第?个隐藏层和第三个隐藏层的梯度会加在?起。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 12:01:51  更:2021-12-07 12:04:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 1:31:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码