Computation in Pytorch

本文详细介绍了PyTorch中计算、参数访问、参数初始化、参数共享以及自定义网络的方法。通过nn.Module和Sequential构建网络,并展示了如何遍历和初始化所有参数。同时,解释了参数共享时的梯度计算原则。此外,还提供了自定义网络层的示例,强调了forward函数的重要性。
部署运行你感兴趣的模型镜像

Computation in Pytorch

记录一些 pytorch 中 Tensor 和 Parameter 使用方法。

Parameter

Parameter Access

每一层的参数存储在相应Parameter类的属性中。eg. weightbias

# 查看所有的参数和对应属性名称
print(net.state_dict())

net[2].bias # Parameter Class
net[2].bias.data = torch.randn(3,3) # 修改模型参数中的数值

注意,如果要直接操作数值,应该通过 .data 赋值修改。(或者说如果要对 auto_grad 中的张量进行赋值,而又要避免 inplace 错误,都要采用 .data 赋值方法)

All Paramters at once

nn.Module 提供 .named_parameters() 方法,返回迭代器,供遍历所有参数使用(比如初始化参数,设置是否需要梯度)。

for name, param in net.named_parameters():
	# name 是相应的 attribute 的名字
	# parameter operation
	param.data = ...

# you can also use name to directly access parameter
net.state_dict()[name].data # eg. name = '2.bias'

Parameter Initialization

def init_normal(m):
	"""
	判断传入 m 的类型,然后据此初始化模型。
	"""
	if type(m) == nn,Linear:
		nn.init.normal_(m.weight, std=0.01)

def my_init(m):
	if isinstance(m, nn.Linear):
		nn.init.uniform_(m.weight, -10, 10)
		m.weight.data *= m.weight.data.abs() >= 5 # `.data` 操作

net.apply(init_normal)

参数共享

神经网络中部分模块共享同一参数。由于 pytorch 是构建计算图,本质上使用同一个对象进行多次操作。

shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
					shared, nn.ReLU(),
					shared, nn.ReLU())

对第二层和第三层计算梯度时,内存中实际的梯度(只有一份)是两者之和,因为 pytorch 计算梯度是相加累积的原则。

Module

自定义网络

自定义网络层,实现获取,初始化,保存,装载,共享参数。具体的参数创建可以看各个模块的初始化函数。

class MyLinear(nn.Module):
	def __init__(self, in_units, out_units):
		super().__init__()
		self.weight = nn.Parameter(torch.randn(in_uints, out_units))
		self.bias = nn.Parameter(torch.randn(out_uints,))
		
	def forward(self, x):
		linear = torch.matmul(x, self.weight.data) + self.bias.data
		return linear

nn.Module

Sequential

继承了 nn.Module

对于 nn.Module 中的 add_module 方法,则变为在尾部添加一个以 name 为属性的模块。并且按顺序执行。

# Example of using Sequential
model = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )

# Example of using Sequential with OrderedDict
model = nn.Sequential(OrderedDict([
          ('conv1', nn.Conv2d(1,20,5)),
          ('relu1', nn.ReLU()),
          ('conv2', nn.Conv2d(20,64,5)),
          ('relu2', nn.ReLU())
        ]))

参考:

  1. d2l

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

06-26
PyTorch 是一个基于 Python 的科学计算包,专门针对需要使用张量(Tensor)进行高效计算的深度学习任务。它提供了灵活的张量计算功能,类似于 NumPy,但增加了 GPU 加速支持和自动求导机制,使得构建和训练神经网络变得更加直观和高效[^4]。 ### 核心特性 - **动态计算图(Dynamic Computation Graph)**:与 TensorFlow 等静态图框架不同,PyTorch 使用“定义即运行”(Define-by-Run)的方式,使调试和开发更加直观。 - **自动微分(Autograd)**:通过 `torch.autograd` 模块,可以自动计算梯度,简化了反向传播的实现过程。 - **GPU 加速**:PyTorch 支持将张量和模型部署到 GPU 上进行加速计算。 - **模块化设计**:通过 `torch.nn` 模块提供了一系列神经网络层、损失函数和优化器,便于快速搭建深度学习模型。 - **丰富的生态系统**:如 TorchVision、TorchText 和 TorchAudio 提供了图像、文本和音频处理的标准接口,极大提升了开发效率。 ### 基本使用指南 #### 张量操作 PyTorch 的核心数据结构是 `Tensor`,它可以看作是多维数组,并支持多种操作: ```python import torch # 创建一个未初始化的 3x4 张量 x = torch.empty(3, 4) # 创建一个随机初始化的 3x4 张量 x = torch.rand(3, 4) # 张量加法 y = torch.rand(3, 4) z = x + y # 张量形状变换 x = x.view(12) # 将 3x4 转换为 12 维向量 ``` #### 自动求导 在训练神经网络时,PyTorch 的自动求导机制非常关键: ```python # 创建一个张量并启用梯度记录 x = torch.ones(2, 2, requires_grad=True) # 定义一个简单的计算图 y = x + 2 z = y * y * 3 out = z.mean() # 反向传播计算梯度 out.backward() # 查看梯度 print(x.grad) # 输出梯度值 ``` #### 构建神经网络 使用 `torch.nn` 模块可以轻松定义神经网络: ```python import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 6, 3) # 卷积层 self.conv2 = nn.Conv2d(6, 16, 3) self.fc1 = nn.Linear(16 * 6 * 6, 120) # 全连接层 self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) # 池化层 x = F.max_pool2d(F.relu(self.conv2(x)), 2) x = x.view(-1, self.num_flat_features(x)) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x def num_flat_features(self, x): size = x.size()[1:] # 获取除 batch 维度外的所有维度 num_features = 1 for s in size: num_features *= s return num_features net = Net() print(net) ``` #### 训练流程 训练一个神经网络通常包括以下步骤: 1. **加载数据**:使用 `torch.utils.data.DataLoader` 加载训练集和验证集。 2. **定义损失函数**:例如交叉熵损失(CrossEntropyLoss)、均方误差损失(MSELoss)等。 3. **选择优化器**:如 SGD、Adam 等。 4. **前向传播和反向传播**: ```python import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001) # 假设 inputs 和 labels 是从 DataLoader 中取出的一个批次 outputs = net(inputs) loss = criterion(outputs, labels) # 清空梯度缓存 optimizer.zero_grad() # 反向传播计算梯度 loss.backward() # 更新参数 optimizer.step() ``` #### 扩展库与工具 PyTorch 生态系统中还包括许多扩展库和工具,帮助开发者更高效地完成特定任务: - **TorchVision**:提供常用图像数据集(如 CIFAR-10、ImageNet)和预训练模型(如 ResNet、VGG)。 - **TorchText**:用于自然语言处理任务的数据处理和模型构建。 - **TorchAudio**:提供音频数据处理和相关模型的支持。 - **RandAugment**:一个用于图像增强的 PyTorch 库,支持自动化的数据增强策略[^3]。 - **HED(Holistically-Nested Edge Detection)**:一种边缘检测算法的 PyTorch 实现,适用于图像分割和特征提取任务[^1]。 ### 文档与学习资源 为了更好地掌握 PyTorch,建议参考官方文档和社区提供的中文资料。例如,《PyTorch 中文文档.pdf》是一个非常实用的学习资源,涵盖了从基础操作到高级特性的详细说明[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值