torch 卷积神经网络构建(3)

本文详细解读了特征图的计算公式,以及池化层如何影响输出尺寸,并介绍了数据读取的相关内容。重点在于理解卷积神经网络中关键步骤的数学表达和实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔记

在这里插入图片描述

特征图计算公式

(h - ksize + 2* padding)/stride + 1

(28 - 5 + 4)/1 + 1 = 28 * 28 * 16

在这里插入图片描述
在这里插入图片描述
池化层(MaxPool)输出大小计算
O = (I - P) / S +1

在这里插入图片描述
数据读取
在这里插入图片描述

### PyTorch卷积神经网络CNN)代码解析与实现 #### 1. CNN 的基本结构 卷积神经网络(Convolutional Neural Network, CNN)是一种专门用于处理具有网格状拓扑的数据的深度学习模型,尤其适用于图像数据。其核心组件包括卷积层、池化层以及全连接层。 - **卷积层**:通过滤波器提取局部特征[^1]。 - **池化层**:降低空间维度并保留重要信息[^3]。 - **全连接层**:将高层特征映射到类别分数[^2]。 以下是基于 MNIST 数据集的手写数字识别任务中的 CNN 构建过程及其详细解析: --- #### 2. 导入必要的库 构建 CNN 需要导入 `torch` 和其他相关模块来定义模型架构和加载数据。 ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader ``` 这些模块分别负责张量操作、神经网络定义、优化算法、数据预处理和数据加载功能[^2]。 --- #### 3. 数据准备 为了训练 CNN 模型,需要对输入数据进行标准化处理,并将其转换为适合 PyTorch 使用的形式。 ```python transform = transforms.Compose([ transforms.ToTensor(), # 将 PIL Image 或 numpy.ndarray 转换为 Tensor transforms.Normalize((0.5,), (0.5,)) # 归一化处理 ]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(dataset=test_dataset, batch_size=1000, shuffle=False) ``` 上述代码片段展示了如何下载 MNIST 数据集并对其实现批量加载。 --- #### 4. 定义 CNN 模型 下面是一个简单的两层卷积神经网络的设计方案。 ```python class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 第一层卷积 + ReLU + MaxPooling self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1) self.relu1 = nn.ReLU() self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) # 第二层卷积 + ReLU + MaxPooling self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1) self.relu2 = nn.ReLU() self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2) # 全连接层 self.fc1 = nn.Linear(64 * 7 * 7, 128) # 输入大小由前面的 pooling 层决定 self.fc2 = nn.Linear(128, 10) # 输出为 10 类 def forward(self, x): x = self.pool1(self.relu1(self.conv1(x))) # 第一层前向传播 x = self.pool2(self.relu2(self.conv2(x))) # 第二层前向传播 x = x.view(-1, 64 * 7 * 7) # 展平操作 x = torch.relu(self.fc1(x)) # FC Layer with activation function x = self.fc2(x) # Output layer without activation return x ``` 此部分实现了两个卷积层加两次最大池化的组合方式,最终接上一个全连接层完成分类任务[^1]。 --- #### 5. 训练函数设计 编写训练循环以更新权重参数。 ```python def train(model, device, train_loader, optimizer, criterion, epoch): model.train() # 设置模型为训练模式 running_loss = 0.0 correct = 0 total = 0 for data, target in train_loader: data, target = data.to(device), target.to(device) optimizer.zero_grad() # 清零梯度缓存 output = model(data) # 前向传播 loss = criterion(output, target) # 计算损失值 loss.backward() # 反向传播求解梯度 optimizer.step() # 更新参数 _, predicted = torch.max(output, dim=1) total += target.size(0) correct += (predicted == target).sum().item() running_loss += loss.item() avg_loss = running_loss / len(train_loader) accuracy = 100. * correct / total print(f'Epoch {epoch}: Loss={avg_loss:.4f}, Accuracy={accuracy:.2f}%') ``` 该函数包含了完整的训练流程,包括正向传递、误差计算、反向传播及参数调整等步骤。 --- #### 6. 测试函数设计 评估模型性能时需单独设置测试阶段。 ```python def test(model, device, test_loader, criterion): model.eval() # 切换至评估模式 test_loss = 0 correct = 0 with torch.no_grad(): # 关闭自动求导机制提升效率 for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += criterion(output, target).item() _, predicted = torch.max(output, dim=1) correct += (predicted == target).sum().item() test_loss /= len(test_loader.dataset) accuracy = 100. * correct / len(test_loader.dataset) print(f'Test set: Average loss={test_loss:.4f}, Accuracy={accuracy:.2f}%\n') ``` 这段代码主要用于验证模型在未见过样本上的表现情况。 --- #### 7. 主程序入口 最后整合以上所有组件形成完整的工作流。 ```python device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = SimpleCNN().to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) for epoch in range(1, 11): # 进行十轮迭代 train(model, device, train_loader, optimizer, criterion, epoch) test(model, device, test_loader, criterion) ``` 运行脚本即可启动整个实验过程[^1]。 --- ### 总结 本文介绍了利用 PyTorch 实现卷积神经网络的具体方法,涵盖了从理论基础到实际编码的关键环节。希望这份指南能够帮助初学者快速掌握 CNN 技术的应用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东哥aigc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值