【深度学习】03-神经网络01-4 神经网络的pytorch搭建和参数计算

计算模型参数,查看模型结构,我们要查看有多少参数,需要先安装包

pip install torchsummary

python 复制代码
import torch
import torch.nn as nn
from torchsummary import summary # 导入 summary 函数,用于计算模型参数和查看模型结构

# 创建神经网络模型类
class Model(nn.Module):
    # 初始化模型的构造函数
    def __init__(self):
        super().__init__()  # 调用父类 nn.Module 的初始化方法
        # 定义第一个全连接层(线性层),3个输入特征,3个输出特征
        self.linear1 = nn.Linear(3, 3)  
        # 使用 Xavier 正态分布初始化第一个全连接层的权重
        nn.init.xavier_normal_(self.linear1.weight)
        
        # 定义第二个全连接层,输入 3 个特征,输出 2 个特征
        self.linear2 = nn.Linear(3, 2)
        # 使用 Kaiming 正态分布初始化第二个全连接层的权重,适合 ReLU 激活函数
        nn.init.kaiming_normal_(self.linear2.weight)
        
        # 定义输出层,输入 2 个特征,输出 2 个特征
        self.out = nn.Linear(2, 2)
        
    # 定义前向传播过程 (forward 函数会自动执行,类似于模型的"推理"过程)
    def forward(self, x):
        # 第一个全连接层运算
        x = self.linear1(x)
        # 使用 Sigmoid 激活函数
        x = torch.sigmoid(x)
        
        # 第二个全连接层运算
        x = self.linear2(x)
        # 使用 ReLU 激活函数
        x = torch.relu(x)
        
        # 输出层运算
        x = self.out(x)
        # 使用 Softmax 激活函数,将输出转化为概率分布
        # dim=-1 表示在最后一个维度(通常是输出的类别维度)上做 softmax 归一化
        x = torch.softmax(x, dim=-1)
        return x
    
if __name__ == '__main__':
    # 实例化神经网络模型
    my_model = Model()
    
    # 随机生成一个形状为 (5, 3) 的输入数据,表示 5 个样本,每个样本有 3 个特征
    my_data = torch.randn(5, 3)
    print("mydata shape", my_data.shape)
    
    # 通过模型进行前向传播,输出模型的预测结果
    output = my_model(my_data)
    print("output shape", output.shape)
    
    # 计算并显示模型的参数总量以及模型结构
    summary(my_model, input_size=(3,), batch_size=5)
    
    # 查看模型中所有的参数,包括权重和偏置项(bias)
    print("-----查看模型参数w 和 b  -----")
    for name, parameter in my_model.named_parameters():
        print(name, parameter)

mydata shape torch.Size([5, 3])

output shape torch.Size([5, 2])


Layer (type) Output Shape Param #

================================================================

Linear-1 [5, 3] 12

Linear-2 [5, 2] 8

Linear-3 [5, 2] 6

================================================================

Total params: 26

Trainable params: 26

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


-----查看模型参数w 和 b -----

linear1.weight Parameter containing:

tensor([[ 0.4777, -0.2076, 0.4900],

[-0.1776, 0.4441, 0.6924],

[-0.5449, 1.6153, 0.0243]], requires_grad=True)

linear1.bias Parameter containing:

tensor([0.4524, 0.2902, 0.4897], requires_grad=True)

linear2.weight Parameter containing:

tensor([[-0.0510, -1.2731, -0.7253],

[-0.6112, 0.1189, -0.4903]], requires_grad=True)

linear2.bias Parameter containing:

tensor([0.5391, 0.2552], requires_grad=True)

out.weight Parameter containing:

tensor([[-0.3271, -0.3483],

[-0.0619, -0.0680]], requires_grad=True)

out.bias Parameter containing:

tensor([-0.5508, 0.5895], requires_grad=True)

代码输出结果解读

​​​​​​​

这个代码的输出展示了两部分内容:

  1. 数据维度和模型输出维度

    • mydata shape torch.Size([5, 3])

    • output shape torch.Size([5, 2])

  2. 模型的结构、参数数量和每一层的权重与偏置

    • 模型的层结构、每一层的输出形状,以及每一层的参数数量。

    • 每层的权重(weight )和偏置(bias)的具体数值。

让我们详细分析每一部分的输出。

1. 输入数据和输出数据的形状

mydata shape torch.Size([5, 3])

这部分的输出说明:

  • 输入数据的形状(5, 3) ,表示有 5 个样本,每个样本有 3 个特征。这与模型定义时的输入层**nn.Linear(3, 3)** 是一致的,输入层期望接收 3 个特征。
output shape torch.Size([5, 2])

这部分的输出说明:

  • 模型输出的形状 为**(5, 2)** ,表示 5 个样本的输出,每个样本的输出有 2 个值。由于模型的输出层定义为 nn.Linear(2, 2),它接收 2 个输入特征并输出 2 个值,符合预期。

2. 模型结构和参数

模型结构和参数信息是通过**summary()** 函数生成的,它列出了每一层的名称、输出形状和参数数量。

详细输出解释:
复制代码
----------------------------------------------------------------
      Layer (type)               Output Shape         Param #
================================================================
          Linear-1                     [5, 3]             12
          Linear-2                     [5, 2]               8
          Linear-3                     [5, 2]               6
================================================================
Total params: 26
Trainable params: 26
Non-trainable params: 0
----------------------------------------------------------------
线性层 1(Linear-1
  • 层的类型Linear ,这是一个全连接层,定义为 nn.Linear(3, 3)

  • 输出形状[5, 3],表示输入了 5 个样本,每个样本有 3 个特征,经过该层的输出仍然是 5 个样本,每个样本有 3 个特征。

  • 参数数量 :12,其中 9 个是权重参数(3 x 3 的权重矩阵),另外 3 个是偏置项。

线性层 2(Linear-2
  • 层的类型Linear ,定义为 nn.Linear(3, 2),将 3 个输入特征映射到 2 个输出特征。

  • 输出形状[5, 2],表示输入了 5 个样本,每个样本有 2 个输出特征。

  • 参数数量 :8,其中 6 个是权重参数(3 x 2 的权重矩阵),另外 2 个是偏置项。

输出层(Linear-3
  • 层的类型Linear ,定义为 nn.Linear(2, 2),接收 2 个输入特征,输出 2 个特征。

  • 输出形状[5, 2],表示 5 个样本,每个样本的输出为 2 个特征。

  • 参数数量 :6,其中 4 个是权重参数(2 x 2 的权重矩阵),另外 2 个是偏置项。

参数统计
  • 总参数数量:26,模型中所有可训练参数(包括权重和偏置)的总数量。

  • 可训练参数 :26,模型中所有参与训练的参数。这里所有的参数都是可训练的(requires_grad=True),没有非可训练的参数。

  • 非可训练参数:0,说明模型中没有被设置为不可训练的参数。

3. 查看每一层的权重和偏置

这一部分输出列出了每一层的具体参数(权重和偏置)的值。

linear1.weight:
复制代码
tensor([[ 0.4777, -0.2076, 0.4900],
      [-0.1776, 0.4441, 0.6924],
      [-0.5449, 1.6153, 0.0243]], requires_grad=True)

这是 linear1 层的权重矩阵,形状是 (3, 3) 。由于 linear1nn.Linear(3, 3) ,它的权重矩阵也是 3 行 3 列。权重参数是使用 Xavier 初始化(nn.init.xavier_normal_)初始化的。

linear1.bias:
复制代码
tensor([0.4524, 0.2902, 0.4897], requires_grad=True)

这是 linear1 层的偏置项,形状是 (3,),因为每个输出特征对应一个偏置值。

linear2.weight:
复制代码
tensor([[-0.0510, -1.2731, -0.7253],
      [-0.6112, 0.1189, -0.4903]], requires_grad=True)

这是 linear2 层的权重矩阵,形状是 (2, 3) ,因为 linear2nn.Linear(3, 2) ,需要 3 个输入特征映射到 2 个输出特征。权重是使用 Kaiming 初始化**(nn.init.kaiming_normal_)**初始化的。

linear2.bias:
复制代码
tensor([0.5391, 0.2552], requires_grad=True)

这是 linear2 层的偏置项,形状是 (2,),因为每个输出特征对应一个偏置值。

out.weight:
复制代码
tensor([[-0.3271, -0.3483],
      [-0.0619, -0.0680]], requires_grad=True)

这是输出层 out 的权重矩阵,形状是 (2, 2),因为 outnn.Linear(2, 2),接收 2 个输入特征并输出 2 个特征。

out.bias:
复制代码
tensor([-0.5508, 0.5895], requires_grad=True)

这是输出层 out 的偏置项,形状是 (2,)

总结

  • 这段代码展示了一个简单的神经网络模型,包含 3 个全连接层(线性层),每层的输入输出特征数量逐步缩小。

  • 我们通过 summary() 查看了模型的整体结构,展示了每一层的输出形状和参数数量,总共有 26 个参数。

  • 每一层的权重和偏置参数值被输出,展示了它们是如何被初始化的(通过 Xavier 和 Kaiming 初始化)。

  • 该模型的前向传播通过激活函数(sigmoidReLU)以及 softmax 将输出转化为概率分布。

​​​​​​​​​​​​​​

相关推荐
江_小_白33 分钟前
自动驾驶之激光雷达
人工智能·机器学习·自动驾驶
yusaisai大鱼2 小时前
TensorFlow如何调用GPU?
人工智能·tensorflow
珠海新立电子科技有限公司4 小时前
FPC柔性线路板与智能生活的融合
人工智能·生活·制造
IT古董5 小时前
【机器学习】机器学习中用到的高等数学知识-8. 图论 (Graph Theory)
人工智能·机器学习·图论
曼城周杰伦5 小时前
自然语言处理:第六十三章 阿里Qwen2 & 2.5系列
人工智能·阿里云·语言模型·自然语言处理·chatgpt·nlp·gpt-3
余炜yw5 小时前
【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
人工智能·rnn·深度学习
莫叫石榴姐6 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
96776 小时前
对抗样本存在的原因
深度学习
如若1236 小时前
利用 `OpenCV` 和 `Matplotlib` 库进行图像读取、颜色空间转换、掩膜创建、颜色替换
人工智能·opencv·matplotlib
YRr YRr6 小时前
深度学习:神经网络中的损失函数的使用
人工智能·深度学习·神经网络