卷积神经网络(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