深度学习——神经网络搭建和参数计算

51 阅读1分钟

构建神经网络

自定义模型类

在pytorch中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法:

  • __init__方法中定义网络中的层结构,主要是全连接层,并进行初始化;
  • forward方法,在调用神经网络模型对象的时候,底层会自动调用函数。该函数中为初始化定义的layer传入数据,进行前向传播等。

构建如下图所示的神经网络模型:

  • 第1个隐藏层:权重初始化采用标准化的xavier初始化,激活函数使用sigmoid
  • 第2个隐藏层:权重初始化采用标准化的He初始化,激活函数使用ReLU
  • 输出层:假定多分类,采用SoftMax做数据归一化

image.png

构造神经网络模型代码

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)