构建神经网络
自定义模型类
在pytorch中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法:
- __init__方法中定义网络中的层结构,主要是全连接层,并进行初始化;
- forward方法,在调用神经网络模型对象的时候,底层会自动调用函数。该函数中为初始化定义的layer传入数据,进行前向传播等。
构建如下图所示的神经网络模型:
- 第1个隐藏层:权重初始化采用标准化的xavier初始化,激活函数使用sigmoid
- 第2个隐藏层:权重初始化采用标准化的He初始化,激活函数使用ReLU
- 输出层:假定多分类,采用SoftMax做数据归一化
构造神经网络模型代码
import torch
from torch import nn
from torchsummary import summary
class My_Model(nn.Module):
def __init__(self):
print('init方法执行...')
# 调用父类的构造方法
super().__init__()
# 定义网络结构
self.fc1 = nn.Linear(3, 3)
self.fc2 = nn.Linear(3, 2)
self.out = nn.Linear(2, 2)
# 初始化权重和偏置参数
nn.init.xavier_normal_(self.fc1.weight)
nn.init.zeros_(self.fc1.bias)
nn.init.kaiming_normal_(self.fc2.weight)
nn.init.zeros_(self.fc2.bias)
def forward(self, x):
print('forward方法执行...')
x = torch.sigmoid(self.fc1(x))
x = torch.relu(self.fc2(x))
x = torch.softmax(self.out(x), dim=-1)
return x
if __name__ == '__main__':
model = My_Model() # 自动调用__init__()方法
x = torch.randn(1, 3)
print(x)
prob = model(x) # 自动调用forward()方法
print(prob)
# 可视化参数
summary(model=model, input_size=(3, ), batch_size=10, device='cuda')
for name, param in model.named_parameters():
print(name, param)