pytorch 定义使用哪些网络层这是干什么 2个网络层和20个的区别 ,怎么定义用那些网络层 并且这些网络层如何组成

续用「搭积木盖房子」的比喻,这次重点讲「怎么挑积木」和「怎么搭房子」,保证零基础也能懂~

一、定义网络层:就像「挑积木类型」

1. 常用积木(网络层)有哪些?各干啥用?

积木名称(PyTorch 层)白话功能描述常见用途举例
nn.Linear(全连接层) 把输入数字全部「串起来」做线性变换,像「数字加工厂」,输入多少数就输出多少数。 最后分类层(比如输出 10 个类别概率)、简单数据变换。
nn.Conv2d(卷积层) 像「局部扫描仪」,只扫描输入数据的一小块(比如图像的一个区域),提取局部特征(比如边缘、颜色)。 处理图像、视频(识别物体轮廓)。
nn.MaxPool2d(池化层) 像「数据压缩器」,把大块数据缩小成小块,扔掉不重要的细节,保留关键信息。 减少数据量,防止过拟合(比如把 28×28 图像缩成 14×14)。
nn.ReLU(激活函数) 像「信号开关」,把负数信号变成 0(关掉),正数信号保留(打开),让模型能学复杂逻辑。 几乎每个隐藏层后面都要加,不然模型只能学线性关系。
nn.Dropout(丢弃层) 像「防作弊器」,训练时随机扔掉一些神经元的信号,防止模型死记硬背训练数据。 防止过拟合(比如考试时突然遮住部分题目,看模型真的懂没)。
nn.BatchNorm2d(批归一化层) 像「数据净化器」,把数据规整到统一范围,让模型训练更稳定。 加速训练收敛,比如把像素值从杂乱范围规整到接近 0-1。

2. 怎么「挑积木」(定义网络层)?两种方式:

方式 1:简单模型用「傻瓜式拼装」(nn.Sequential)
python
 
运行
 
 
 
 
# 场景:盖个简单的「数字识别小屋」(识别0-9手写数字)
import torch.nn as nn

# 一次性把积木按顺序堆起来
model = nn.Sequential(
    nn.Linear(784, 256),    # 第1块积木:输入784个数字(28×28像素)→ 输出256个数字
    nn.ReLU(),              # 第2块积木:激活函数,关掉负数信号
    nn.Dropout(0.2),        # 第3块积木:随机扔掉20%的信号防作弊
    nn.Linear(256, 10)      # 第4块积木:输出10个数字(对应0-9的概率)
)
# 特点:像搭乐高积木,按顺序排好就行,适合简单模型。
 
方式 2:复杂模型用「自定义图纸」(继承 nn.Module)
python
 
运行
 
 
 
 
# 场景:盖个「图像识别大楼」(识别猫狗等动物)
import torch.nn as nn

# 先画图纸(定义类),想怎么搭就怎么搭
class AnimalModel(nn.Module):
    def __init__(self):
        super().__init__()
        # 定义积木(层),可以随意组合
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3)  # 扫描3通道图像,输出64个特征图
        self.bn1 = nn.BatchNorm2d(64)                # 净化这64个特征图
        self.relu = nn.ReLU()                        # 开关
        self.pool = nn.MaxPool2d(2)                  # 压缩器,把图像缩小一半
        self.fc = nn.Linear(64 * 16 * 16, 10)        # 最后分类层(假设压缩后是16×16像素)
    
    def forward(self, x):
        # 定义「积木搭建顺序」(前向传播)
        x = self.relu(self.bn1(self.conv1(x)))  # 扫描→净化→开关
        x = self.pool(x)                        # 压缩
        x = x.view(-1, 64 * 16 * 16)            # 把数据拍扁成一维,方便全连接层处理
        x = self.fc(x)                          # 分类
        return x

model = AnimalModel()  # 按图纸盖房子
# 特点:像盖高楼需要设计图纸,灵活调整积木顺序和连接方式,适合复杂模型。
 

二、网络层如何「搭起来」?核心逻辑:按数据处理流程排顺序

1. 以「图像识别」为例,积木搭建流程:

plaintext
 
 
输入图像(比如224×224×3) → 卷积层 → 激活函数 → 池化层 → (重复几次) → 全连接层 → 输出结果
 

  • 类比盖房子:
    1. 门口安检(卷积 + 激活):先扫描图像局部(卷积),提取边缘、颜色等「基础特征」,再用激活函数过滤无效信号(比如只保留明显的边缘)。
    2. 压缩存储(池化):把图像缩小,只保留关键特征(比如把 224×224 像素缩成 112×112,但关键轮廓还在)。
    3. 多次加工(多层卷积 + 池化):像组装零件,先认出门框、窗户(低级特征),再认出门、房子(高级特征)。
    4. 最终决策(全连接):把所有特征汇总,判断这是「猫」还是「狗」(输出分类结果)。

2. 数据形状变化示例(直观理解积木怎么连接):

假设输入是一张 3 通道、28×28 像素的图像:

plaintext
 
 
输入形状:[batch_size, 3, 28, 28]  →  batch_size是一次处理的图片数(比如16张)

1. 卷积层:nn.Conv2d(3, 16, kernel_size=3, stride=1)
   - 输出形状:[batch_size, 16, 26, 26]  →  16个特征图,尺寸缩小2像素(因为卷积核3×3)
   
2. 池化层:nn.MaxPool2d(2)
   - 输出形状:[batch_size, 16, 13, 13]  →  尺寸再缩小一半(13=26/2)
   
3. 全连接层:nn.Linear(16×13×13, 10)
   - 先把数据拍扁成一维:16×13×13=2704个数字
   - 输出10个数字(对应10个类别概率)
 

  • 关键:前一层的输出形状必须等于后一层的输入形状,就像积木的接口必须匹配,不然搭不起来~

三、2 层 vs20 层模型的「搭建区别」:积木数量和复杂度

1. 2 层模型(简易平房):

  • 积木少:比如「输入层→全连接层→输出层」,中间只加 1 个激活函数。
  • 搭建简单:像用 2 块积木搭个小板凳,只能坐人(解决简单问题)。
  • 例子:识别黑白数字 0-9,因为数字形状简单,不需要太多层提取特征。

2. 20 层模型(摩天大楼):

  • 积木多且复杂:大量卷积层 + 池化层 + 激活函数 + 全连接层,层层嵌套。
  • 搭建讲究:像盖高楼需要设计电梯、水管、电路(比如不同层之间的残差连接、注意力机制)。
  • 例子:识别复杂场景中的物体(比如自动驾驶识别行人、汽车、红绿灯),需要多层:
    • 前几层:认边缘、颜色(低级特征)
    • 中间层:认轮子、车灯(中级特征)
    • 后几层:认汽车、行人(高级特征)
  • 注意:层多了容易「积木搭歪」(过拟合),需要加 Dropout、BatchNorm 等「加固零件」。

四、怎么决定用哪些层、怎么搭?根据任务「量身定制」

  1. 看数据类型:
    • 图像:多用卷积层 + 池化层(因为图像有局部规律)。
    • 文字:多用循环层(RNN)或 Transformer(因为文字有前后顺序)。
    • 简单数字:直接全连接层(因为数字之间是线性关系)。
  2. 看任务难度:
    • 简单任务(比如二分类):少用层,避免「杀鸡用牛刀」。
    • 复杂任务(比如生成图像):必须多层,不然学不到深层规律。
  3. 参考经典模型「抄作业」:
    • 图像分类:抄 ResNet(多层卷积 + 残差连接)、VGG(堆叠小卷积核)。
    • 自然语言处理:抄 BERT(全用 Transformer 层)。
    • 就像盖房子参考别人的户型图,新手不用自己设计,改改就行~

五、总结:网络层定义和组合的核心

  1. 定义层:选合适的积木(层),告诉模型每个积木的功能(输入输出尺寸、参数)。
  2. 组合层:按数据处理流程排顺序,让前一层的输出能喂给后一层(接口对齐)。
  3. 层数选择:任务简单就少搭积木,任务复杂就多搭,但要加「加固零件」防过拟合。
  4. 终极比喻:网络层就像流水线,数据是原材料,层层加工后变成你要的结果(比如把图像加工成「这是猫」的判断)。
posted @ 2025-06-16 00:32  m516606428  阅读(32)  评论(0)    收藏  举报