PyTorch深度学习框架基础——实现卷积神经网络,并解析

喜欢花科技君 2025-03-08 02:22:10

卷积神经网络(Convolutional Neural Network)是一种深度学习算法,其在图像识别、视频分析和自然语言处理等领域表现出色。CNN通过使用卷积层来提取图像数据的局部特征,然后通过池化层(Pooling Layer)来降低特征的空间维度,最后通过全连接层(Fully Connected Layer)进行分类或回归任务。

下面使用 PyTorch 实现卷积神经网络(CNN)的代码并逐行解析。使用经典的 LeNet-5 结构,并在 CIFAR-10 数据集上进行图像分类。

import torchimport torch.nn as nnimport torch.nn.functional as F# 定义卷积神经网络模型class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() # 第一个卷积层:输入3通道(RGB),输出6通道,卷积核5x5 self.conv1 = nn.Conv2d(3, 6, 5) # 最大池化层:窗口2x2,步长2 self.pool = nn.MaxPool2d(2, 2) # 第二个卷积层:输入6通道,输出16通道,卷积核5x5 self.conv2 = nn.Conv2d(6, 16, 5) # 全连接层:输入维度16*5*5,输出120 self.fc1 = nn.Linear(16 * 5 * 5, 120) # 全连接层:120 → 84 self.fc2 = nn.Linear(120, 84) # 输出层:84 → 10(对应CIFAR-10的10个类别) self.fc3 = nn.Linear(84, 10) def forward(self, x): # 卷积 → ReLU激活 → 池化 x = self.pool(F.relu(self.conv1(x))) # 输入形状变化:3x32x32 → 6x28x28 → 6x14x14 x = self.pool(F.relu(self.conv2(x))) # 形状变化:6x14x14 → 16x10x10 → 16x5x5 # 展平多维特征图(保留batch维度) x = x.view(-1, 16 * 5 * 5) # 展平为400维向量(16*5*5=400) x = F.relu(self.fc1(x)) # 全连接层+ReLU激活 x = F.relu(self.fc2(x)) # 全连接层+ReLU激活 x = self.fc3(x) # 最终输出层(无激活函数) return x# 初始化模型、损失函数和优化器model = CNN()criterion = nn.CrossEntropyLoss() # 交叉熵损失(包含Softmax)optimizer = torch.optim.SGD( model.parameters(), lr=0.001, momentum=0.9)# 示例训练循环(假设已定义DataLoader)def train(model, train_loader, epochs=10): for epoch in range(epochs): running_loss = 0.0 for inputs, labels in train_loader: optimizer.zero_grad() # 清零梯度 outputs = model(inputs) # 前向传播 loss = criterion(outputs, labels) loss.backward() # 反向传播 optimizer.step() # 更新参数 running_loss += loss.item() print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}")代码解析网络结构定义卷积层 (nn.Conv2d):conv1: 输入3通道(RGB),输出6通道,使用5x5卷积核conv2: 输入6通道,输出16通道,同样使用5x5卷积核卷积操作通过局部感受野提取空间特征(如边缘、纹理)池化层 (nn.MaxPool2d):使用2x2窗口、步长2的最大池化降低特征图维度,增强平移不变性全连接层 (nn.Linear):将展平的特征向量映射到分类空间通过逐步降维(400 → 120 → 84 → 10)实现非线性组合前向传播 (forward)

输入处理:

x = self.pool(F.relu(self.conv1(x))):卷积 → ReLU激活 → 池化输入形状变化:3x32x32 → 6x14x14重复类似操作得到16x5x5的特征图

特征展平:

x.view(-1, 16*5*5): 将多维特征图展平为向量(保留batch维度)

分类决策:

通过全连接层逐步降维,最终输出10维(对应CIFAR-10的10个类别)训练配置损失函数: 交叉熵损失 (nn.CrossEntropyLoss)内部集成Softmax,直接处理原始输出(logits)优化器: 带动量的SGDlr=0.001: 学习率momentum=0.9: 加速收敛,减少震荡训练循环梯度清零: optimizer.zero_grad() 防止梯度累积前向传播: outputs = model(inputs)损失计算: 对比预测结果与真实标签反向传播: loss.backward() 计算梯度参数更新: optimizer.step() 更新权重关键计算说明

卷积后尺寸计算:

公式: conv1: 输入32x32 → 输出28x28(32−5+1=28)pool1: 28x28 → 14x14(窗口2x2,步长2)conv2: 14x14 → 10x10(14−5+1=1014−5+1=10)pool2: 10x10 → 5x5

全连接层输入:

最终特征图尺寸:16通道 × 5×5 → 400维向量改进方向增加批量归一化层 (nn.BatchNorm2d) 加速训练使用更深的网络结构(如 AlexNet、ResNet)数据增强(随机裁剪、翻转)提升泛化性学习率调度(如 torch.optim.lr_scheduler)

0 阅读:0

喜欢花科技君

简介:感谢大家的关注