pytorch概念

 

卷积神经网络(CNN)

卷积层(Convolutional Layer)

卷积层是CNN中最核心层之一, 它模拟生物视觉皮层中神经元对局部区域刺激响应

卷积层通过一系列可学习卷积核(也称为滤波器)对输入数据进行扫描, 以提取局部特征

作用

  • 特征提取

卷积核能够学习并提取输入数据中局部特征, 如边缘、纹理和形状等

  • 参数共享

卷积核在输入数据不同位置共享相同权重, 大大减少网络参数数量, 降低计算复杂度

  • 平移不变性

由于卷积核在输入数据上滑动, 因此网络对输入数据平移具有一定鲁棒性

最大池化层(Max Pooling Layer)

最大池化层是一种下采样操作, 它通过对输入数据局部区域取最大值来减少数据空间维度(高度和宽度), 同时保留重要特征

作用

  • 降维

减少数据空间维度, 降低计算量和内存消耗

  • 特征选择

通过取局部区域最大值, 最大池化层能够选择最具代表性特征, 提高网络泛化能力

  • 平移不变性

与卷积层类似, 最大池化层也对输入数据平移具有一定鲁棒性

全连接层(Fully Connected Layer, FC Layer)

全连接层是神经网络中传统层, 其中每个神经元都与前一层所有神经元相连

在CNN中, 全连接层通常位于卷积层和池化层之后, 用于整合卷积层提取特征并进行分类或回归任务

作用

  • 特征整合

全连接层能够整合卷积层提取的局部特征, 形成全局特征表示

  • 分类或回归

在网络最后几层, 全连接层通常与softmax激活函数或线性回归头相结合, 用于输出分类概率或回归值

  • 参数学习

全连接层权重通过反向传播算法进行更新, 以最小化损失函数, 提高网络性能

示例

定义一个简单卷积神经网络(CNN), 通常用于处理图像数据

import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 卷积层1
        # 输入通道数(in_channels):3, 对应于彩色图像的三个颜色通道(红、绿、蓝)
        # 输出通道数(out_channels):6, 表示卷积操作后将生成6个特征图(feature maps)
        # 卷积核大小(kernel_size):5x5, 卷积核高度和宽度
        # 默认情况下, padding为0, stride(步长)为1
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5)

        # 最大池化层
        # 使用最大池化(MaxPool2d), 核大小为2x2, 步长也为2
        # 有助于减少特征图的空间维度(高度和宽度), 同时保留最重要的信息
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)

        # 卷积层2
        # 输入通道数为 6(来自第一个卷积层输出)
        # 输出通道数为 16
        # 卷积核大小为 5x5
        # 同样, padding默认为0, stride为1
        self.conv2 = nn.Conv2d(6, 16, 5)

        # 全连接层
        # 全连接层1, 将平铺后的特征图(大小为16x5x5)作为输入, 输出120个节点
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        # 全连接层2, 将fc1输出作为输入, 输出84个节点
        self.fc2 = nn.Linear(120, 84)
        # 全连接层3, 将fc2输出作为输入, 输出10个节点, 通常对应于分类任务的类别数
        self.fc3 = nn.Linear(84, 10)

    # 前向传播
    def forward(self, x):
        # 输入数据x首先通过第一个卷积层conv1, 接着应用ReLU激活函数, 通过第一个池化层pool
        x = self.pool(F.relu(self.conv1(x)))
        # 数据通过第二个卷积层conv2, 再次应用ReLU激活函数, 然后通过同一个池化层pool
        x = self.pool(F.relu(self.conv2(x)))
        # 池化后, 特征图被平铺(view操作), 转换为一维向量, 以便可以输入到全连接层
        x = x.view(-1, 16 * 5 * 5)

        # 数据依次通过三个全连接层fc1、fc2和fc3, 应用ReLU激活函数
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x