PyTorch搭建神经网络

核心结论:用 PyTorch 搭建神经网络主要有两种方式,自定义模型灵活适配复杂需求,Sequential 快速搭建简单顺序结构,关键是明确层结构、初始化参数和查看模型信息。

一、核心概念:模型是 "层的组合"

神经网络的核心是把不同功能的层(比如全连接层、激活层)按顺序拼起来,就像搭积木。PyTorch 里所有模型和层都基于**Module**类,只要继承它并实现两个核心方法,就能自定义模型。

二、两种搭建方式

1. 自定义模型(灵活款)

适合复杂结构(比如多分支、特殊逻辑),需要手动定义层和数据流向。

  • 步骤:
    1. 继承torch.nn.Module,在__init__里定义各层(比如全连接层、激活层),并初始化权重(比如 Xavier 适配 Tanh,He 适配 ReLU)。
    2. forward里写数据传播路径:输入→第一层→激活函数→第二层→...→输出。
  • 优势:想怎么改就怎么改,支持各种复杂逻辑。

根据上图的神经网络Pytorch代码实现:

  • 第1个隐藏层:使用Xavier 正态分布初始化权重,激活函数使用 Tanh。

  • 第 2个隐藏层:使用 He正态分布初始化权重,激活函数使用ReLU。

  • 输出层:按默认方式初始化,激活函数使用 Softmax。

    #自定义模型
    import torch
    import torch.nn as nn

    class Model(nn.Module):
    def init(self):
    super(Model,self).init() #继承父类初始化
    self.linear1 = nn.Linear(3,4) #第一个隐藏层,输入3个特征,输出4个特征
    nn.init.xavier_normal_(self.linear1.weight) #初始化权重
    self.linear2 = nn.Linear(4,4) #第二个隐藏层,输入4个特征,输出4个特征
    nn.init.kaiming_normal_(self.linear2.weight) #第二个隐藏层,输入4个特征,输出4个特征
    self.linear3 = nn.Linear(4,2) #输出层,输入4个特征,输出1个特征,默认使用He初始化

    复制代码
      def forward(self,x):
          x = self.linear1(x)     #经过第一个隐藏层
          x = torch.relu(x)       #激活函数
          x = self.linear2(x)     #经过第二个隐藏层
          x = torch.relu(x)       #激活函数
          x = self.linear3(x)     #输出层
          x = torch.softmax(x,dim=1)    #激活函数
          return x        

    model = Model()
    output = model(torch.randn(10,3))
    print("输出:\n",output)
    print()

    #使用named_paremeters()查看各层参数
    print("模型参数:")
    for name,param in model.named_parameters():
    print(name,":",param.size())
    print()

    #使用state_dict()查看各层参数
    print("模型参数:\n",model.state_dict())

查看模型结构与参数数量:

可使用 torchsummary.summary 来查看模型结构与参数数量。需要先安装torchsumm库:

复制代码
pip install torchsummary

#模型结构和参数查看
from torchsummary import summary
# input_size:特征数,batch_size:样本数
summary(model, input_size=(3,), batch_size=10, device="cpu")

2. Sequential 搭建(快捷款)

适合简单的 "顺序结构"(一层接一层,无分支),直接按顺序传入层即可。

  • 步骤:

    1. 把要用到的层按顺序放进nn.Sequential()里,自动按顺序执行。
    2. apply()方法批量初始化各层参数(比如给所有全连接层初始化权重)。
  • 优势:代码简洁,不用写forward,快速搭建基础模型。

    #构建模型
    model = nn.Sequential(
    nn.Linear(3,4),
    nn.Tanh(),
    nn.Linear(4,4),
    nn.ReLU(),
    nn.Linear(4,2),
    nn.Softmax(dim=1)
    )

    #初始化参数
    def init_weights(m):
    """判断当前层是否为线性层(全连接层)。
    如果是,则执行下面的初始化操作;
    如果不是(例如卷积层、RNN层),则跳过。"""
    if type(m) == nn.Linear:
    nn.init.xavier_normal_(m.weight) #初始化权重
    m.bias.data.fill_(0.01) #填充0.01偏置

    model.apply(init_weights)#apply会遍历所有子模块依次调用函数

    output = model(torch.randn(10,3))
    print("输出:\n",output)

三、关键操作:查看模型信息

搭好模型后,需要确认结构和参数是否正确:

  • 查看参数:用named_parameters()state_dict(),能看到每一层的权重、偏置数值。
  • 查看结构和参数数量:用torchsummary.summary(),输入输入数据的形状,就能看到每层的输出形状、参数个数,避免结构出错。

四、通俗总结

  • 简单任务用 Sequential,几行代码搞定;复杂任务用自定义模型,灵活适配需求。
  • 初始化权重有讲究:ReLU 配 He 初始化,Tanh/Sigmoid 配 Xavier 初始化,避免模型 "学不动"。
  • 搭完必看结构和参数,确认每层输出符合预期,不然训练时容易报错。
相关推荐
郝学胜-神的一滴20 分钟前
玩转PyTorch:detach函数破解自动微分张量转numpy难题
人工智能·pytorch·python·深度学习·机器学习·numpy
深度学习lover25 分钟前
<数据集>yolo 胸部X光疾病识别<目标检测>
人工智能·深度学习·yolo·目标检测·计算机视觉·胸部x光疾病检测
<-->25 分钟前
DeepSpeed 学习指南
人工智能·pytorch·python·深度学习·transformer
泰恒26 分钟前
计算机视觉基础
人工智能·深度学习·机器学习·计算机视觉
AI医影跨模态组学27 分钟前
Radiology(IF=15.2)重庆大学附属肿瘤医院张久权教授团队:基于MRI肿瘤内异质性量化预测乳腺癌新辅助化疗反应的列线图
人工智能·深度学习·机器学习·论文·医学·医学影像
yuanmazhiwu1 小时前
计算机毕业设计:Python全国空气质量与气象监测平台 Flask框架 可视化 数据分析 机器学习 天气 深度学习 AI 空气质量分析(建议收藏)✅
人工智能·python·深度学习·数据挖掘·flask·汽车·课程设计
泰恒9 小时前
openclaw近期怎么样了?
人工智能·深度学习·机器学习
万添裁14 小时前
pytorch的张量数据结构以及各种操作函数的底层原理
人工智能·pytorch·python
Binary_ey14 小时前
光刻技术第22期 | 贝叶斯压缩感知光源优化的优化技术及对比分析
人工智能·深度学习·机器学习
咚咚王者15 小时前
人工智能之知识处理 知识推理 第三章 图神经网络与知识推理:让图谱“活”起来
人工智能·深度学习·神经网络