做网站和app多少费用,沈阳高端网站设计,网站开发 哪个工具更快,长图片生成器在线制作改编自李沐老师《动手深度学习》5.2. 参数管理 — 动手学深度学习 2.0.0 documentation (d2l.ai) 在深度学习中#xff0c;一旦我们选择了模型架构并设置了超参数#xff0c;我们就会进入训练阶段。训练的目标是找到能够最小化损失函数的模型参数。这些参数在训练后用于预测一旦我们选择了模型架构并设置了超参数我们就会进入训练阶段。训练的目标是找到能够最小化损失函数的模型参数。这些参数在训练后用于预测有时我们也需要将它们提取出来以便在其他环境中使用或者保存模型以便在其他软件中执行甚至是为了科学理解而进行检查。
参数访问
访问模型参数
在PyTorch中我们可以通过模型的层来访问参数。每一层都有自己的参数比如权重和偏置。我们可以通过索引来访问这些参数。
import torch
from torch import nn# 定义一个简单的模型
net nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X torch.rand(size(2, 4))
output net(X)
我们可以通过索引来检查模型中特定层的参数。
# 打印第二层全连接层的参数
print(net[2].state_dict())
这会显示第二层的权重和偏置它们是模型学习的关键部分。
访问特定参数的值
我们可以进一步提取特定参数的值。这通常在我们需要对参数进行特定操作时非常有用。
# 打印第二层的偏置参数
print(net[2].bias)
print(net[2].bias.data)
参数是复合对象包含值、梯度和其他信息。在没有进行反向传播的情况下参数的梯度处于初始状态。
一次性访问所有参数
当需要对所有参数执行操作时可以一次性访问所有参数。这在处理大型模型时尤其有用。
# 打印所有层的参数名称和形状
print(*[(name, param.shape) for name, param in net.named_parameters()])
从嵌套块收集参数
当模型由多个子模块组成时我们可以通过类似列表索引的方式来访问这些子模块的参数。
# 定义一个子模块
def block1():return nn.Sequential(nn.Linear(4, 8), nn.ReLU(),nn.Linear(8, 4), nn.ReLU())# 定义一个包含多个子模块的模型
def block2():net nn.Sequential()for i in range(4):net.add_module(fblock {i}, block1())return net# 创建一个包含嵌套子模块的模型
rgnet nn.Sequential(block2(), nn.Linear(4, 1))
output rgnet(X)# 打印模型结构
print(rgnet)# 访问嵌套子模块的参数
print(rgnet[0][1][0].bias.data)
参数初始化
内置初始化
PyTorch提供了多种预置的初始化方法我们可以根据需要选择。
# 初始化所有权重为高斯随机变量偏置为0
def init_normal(m):if type(m) nn.Linear:nn.init.normal_(m.weight, mean0, std0.01)nn.init.zeros_(m.bias)
net.apply(init_normal)
自定义初始化
有时我们需要自定义初始化方法来满足特定的需求。
# 自定义初始化方法
def my_init(m):if type(m) nn.Linear:print(Init, *[(name, param.shape)for name, param in m.named_parameters()][0])nn.init.uniform_(m.weight, -10, 10)m.weight.data * m.weight.data.abs() 5net.apply(my_init)
参数绑定
有时我们希望在多个层间共享参数。在PyTorch中我们可以通过引用同一个层的参数来实现这一点。
# 定义一个共享层
shared nn.Linear(8, 8)# 使用共享层构建模型
net nn.Sequential(nn.Linear(4, 8), nn.ReLU(),shared, nn.ReLU(),shared, nn.ReLU(),nn.Linear(8, 1))
output 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])
这个例子展示了如何在模型的不同层之间共享参数以及如何通过改变一个参数来影响另一个参数。这种技术在构建复杂的神经网络时非常有用。