动手学深度学习(五):深度学习计算

EliorFoy Lv3

(一) 自定义层和块

在之前使用Pytorch的API的时候我们通常都是直接使用net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) ,实际上这是一个Module类的列表.调用net()其实也是net.__call__().
就我看来这个意义不是很大,实际上就是将一些代码整理为了一个类更方便逻辑理解.比如net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))就能表示为这样一个块:

1
2
3
4
5
6
7
8
9
10
11
12
13
class MLP(nn.Module):
# 用模型参数声明层。这里,我们声明两个全连接的层
def __init__(self):
# 调用MLP的父类Module的构造函数来执行必要的初始化。
# 这样,在类实例化时也可以指定其他函数参数,例如模型参数params(稍后将介绍)
super().__init__()
self.hidden = nn.Linear(20, 256) # 隐藏层
self.out = nn.Linear(256, 10) # 输出层

# 定义模型的前向传播,即如何根据输入X返回所需的模型输出
def forward(self, X):
# 注意,这里我们使用ReLU的函数版本,其在nn.functional模块中定义。
return self.out(F.relu(self.hidden(X)))

当然还能添加其它代码使这个块的功能更丰富.

(二) 参数管理

Pytorch提供的对模型参数的读写.

  • net[i].state_dic()返回该层参数字典weightbias
  • net[i].bias.data 直接访问张量
  • net[i].weight.grad 直接访问梯度
  • *[(name, param.shape) for name, param in net.named_parameters()] #('0.weight', torch.Size([8, 4])) ('0.bias', torch.Size([8])) ('2.weight', torch.Size([1, 8])) ('2.bias', torch.Size([1]))

(三) 读写文件

torch.save(tensor,'tensor-file')存,torch.load('tensor-file')

(四) GPU

1
2
3
4
torch.cuda.device_count() # 查看GPU数量
torch.device(f'cuda:{i}'# 第i块GPU,通常能够通过参数device指定
torch.device('cpu')
Z = X.cuda(1) # 移动张量以便在同一个GPU上
  • 标题: 动手学深度学习(五):深度学习计算
  • 作者: EliorFoy
  • 创建于 : 2024-11-05 01:47:12
  • 更新于 : 2024-11-05 01:47:24
  • 链接: https://eliorfoy.github.io/2024/11/05/大三上/动手学深度学习(五):深度学习计算/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
动手学深度学习(五):深度学习计算