一、本章涉及到的专业名词和概念
本章没有模型相关的概念,主要是pytorch相关的函数使用方法
二、模型构造的方法
继承Module类来构造模型
使用Sequential类来构造模型
使用ModuleList类来构造模型
使用ModuleDict类来构造模型
上面四种方法的区别和联系:
- Sequential ModuleList ModuleDict 都继承Module类
- 与Sequential不同,后两者没有定义一个完整的网络,它们只是将不同的模块存放在一起,需要自己定义forward函数
- 虽然Sequential等类可以是模型构造更加简单,但直接继承Module类可以极大地拓展模型构造的灵活性。
三、模型参数的访问
net是定义的模型,使用net中的named_parameters函数
print(type(net.named_parameters()))
for name, param in net.named_parameters():
print(name, param.size())
输出如下
<class 'generator'>
0.weight torch.Size([3, 4])
0.bias torch.Size([3])
2.weight torch.Size([1, 3])
2.bias torch.Size([1])
四、模型参数的初始化
1.PyTorch中nn.Module的模块参数都采取了较为合理的初始化策略
使用init模块的函数进行初始化 比如normal_函数正态分布进行参数的初始化,举例如下
for name, param in net.named_parameters():
if 'weight' in name:
init.normal_(param, mean=0, std=0.01)
print(name, param.data)
五、模型参数的共享
多个层之间共享模型参数
六、自定义层
继承Module类来定义自己的层,让它可以重复使用
和定义网络的方式一样,继承nn.Module类,实现forward函数
七、模型读写
- 使用save 和 load函数 读写tensor
- 仅保存和加载模型参数(推荐)
torch.save(model.state_dict(), 'tensor.pt') model = TheModelClass(*args, **kwargs) model.load_state_dict(torch.load('tensor.pt'))
- 保存和加载整个模型
torch.save(model, 'tensor.pt') model = torch.load('tensor.pt')
八、GPU计算
- gpu相关
torch.cuda.is_available() #查看gpu是否可用 torch.cuda.device_count() #gpu数量 torch.cuda.current_device() #当前gpu索引号 torch.cuda.get_device_name(0) #根据gpu 索引号查看gpu名字 输出 'GeForce GTX 1050’
- gpu计算相关
torch默认是cpu计算,使用.cuda()函数可以将tensor复制到gpu上。x = x.cuda(0) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') x = torch.tensor([1, 2, 3], device=device) # or x = torch.tensor([1, 2, 3]).to(device)
- 模型转换
net.cuda() 将模型从cpu转换到gpu上
tensor必须和net在同一个device上面 - PyTorch可以指定用来存储和计算的设备,如使用内存的CPU或者使用显存的GPU。在默认情况下,PyTorch会将数据创建在内存,然后利用CPU来计算。
PyTorch要求计算的所有输入数据都在内存或同一块显卡的显存上。