目录标题
一、自定义模型
在神经网络框架中,由多个层组成的组件称之为 模块(Module)。
在 PyTorch 中模型就是一个 Module,各网络层、模块也是 Module。Module 是所有神经网络的基类。
在定义一个 Module 时,我们需要继承 torch.nn.Module 并主要实现两个方法:
__init__:定义网络各层的结构,并初始化参数。
forward:根据输入进行前向传播,并返回输出。计算其输出关于输入的梯度,可通过其反向传播函数进行访问(通常自动发生)。forward方法是每次调用的具体实现。
接下来使用 PyTorch 实现下图的神经网络:

第 1 个隐藏层:使用 Xavier 正态分布初始化权重,激活函数使用 Tanh。
第 2 个隐藏层:使用 He 正态分布初始化权重,激活函数使用 ReLU。
输出层:按默认方式初始化,激活函数使用 Softmax。
二、代码
python
import torch
import torch.nn as nn
#自定义神经网络类
class Model(nn.Module):
#初始化
def __init__(self):
super().__init__()
#定义三个线性层
self.linear1 = nn.Linear(3,4)
nn.init.xavier_normal_(self.linear1.weight)
self.linear2 = nn.Linear(4,4)
nn.init.kaiming_normal_(self.linear2.weight)
self.out = nn.Linear(4,2)
#前向传播
def forward(self,x):
x = self.linear1(x)
x = torch.tanh(x)
x = self.linear2(x)
x = torch.relu(x)
x = self.out(x)
x = torch.softmax(x,dim=1)
return x
#测试
# 1.定义输入数据
x = torch.randn(10,3)
# 2. 创建神经网络
model = Model()
# 3.前向传播
output = model(x)
print(f'神经网络输出为:{output}')
三、查看参数
方式一
python
#查看参数 (逐个查看)
print(model.linear1.weight)
print(model.linear1.bias)
print(model.linear1.weight)
print(model.linear1.bias)
print(model.out.weight)
print(model.out.bias)
方式二
python
#调用parameters,直接查看所有参数(输出看不到这些参数对应那些W ,b 等)
for param in model.parameters():
print(param)
方式三
python
#调用parameters,直接查看所有参数
for name,param in model.named_parameters():
print(name,param)
方式四
python
#调用state_dict,得到所有参数的字典表示
print(model.state_dict())
四、查看模型结构和参数数量
可使用 torchsummary.summary 来查看模型结构与参数数量。需要先安装 torchsummary 库:pip install torchsummary。
python
from torchsummary import summary
summary(model,input_size=(3,),batch_size=10,device='cpu')
第一个线性层w 3 * 4 param 里面算了 b 12(3*4) + 4 = 16
第二个线性层w 4 * 4 param 里面算了 b 16(4*4) + 4 = 20
第三个线性层w 4 * 2 param 里面算了 b 8(2*4) + 2 = 10
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Linear-1 [10, 4] 16
Linear-2 [10, 4] 20
Linear-3 [10, 2] 10
================================================================
Total params: 46
Trainable params: 46
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------
五、device
python
input = torch.randn(1,5)
print(input.device)
cpu
input = torch.randn(1,5,device='cuda')
print(input.device)
#我台式没有显卡,报错
AssertionError: Torch not compiled with CUDA enabled
#定义完再修改设备
input.to(device='cuda')
#设置全局变量
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(device)