卷积神经网络 pytorch 图像输入
时间: 2025-06-26 08:03:44 浏览: 12
### PyTorch 中使用卷积神经网络 (CNN) 处理图像输入
在 PyTorch 中构建并训练用于图像分类的 CNN 是一项常见的任务。以下是关于如何实现这一目标的具体说明。
#### 构建模型结构
PyTorch 提供了 `torch.nn.Conv2d` 类来定义二维卷积操作,这是 CNN 的核心组件之一[^1]。为了创建一个完整的 CNN 模型,通常会组合多个卷积层、池化层以及全连接层。下面是一个简单的 CNN 结构示例:
```python
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# 定义第一个卷积层:输入通道数为3(RGB),输出通道数为16,卷积核大小为3x3
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
# 定义第二个卷积层:输入通道数为16,输出通道数为32,卷积核大小为3x3
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)
# 最大池化层,窗口大小为2x2
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
# 全连接层:假设输入特征图大小为32x32,则经过两轮最大池化后变为8x8
self.fc1 = nn.Linear(32 * 8 * 8, 128) # 输入维度由上一层计算得出
self.fc2 = nn.Linear(128, 10) # 输出类别数量为10
def forward(self, x):
# 第一轮卷积 + ReLU激活函数 + 最大池化
x = self.pool(F.relu(self.conv1(x)))
# 第二轮卷积 + ReLU激活函数 + 最大池化
x = self.pool(F.relu(self.conv2(x)))
# 展平张量以便送入全连接层
x = x.view(-1, 32 * 8 * 8)
# 进行两次线性变换
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
```
上述代码展示了如何通过堆叠多层卷积和池化操作逐步提取图像的空间特征,并最终利用全连接层完成分类任务。
#### 计算输出尺寸
当设计 CNN 时,理解每一步操作后的输出尺寸非常重要。如果已知输入图像宽度 \(W\) 和高度相同,卷积核大小 \(F \times F\) ,步幅 \(S\) 及填充 \(P\) ,那么经过一次卷积之后的新尺寸可以按照如下公式计算得到:
\[
N = \frac{W - F + 2P}{S} + 1
\][^3]
此公式适用于每一维方向上的变化情况;对于实际应用中的彩色图片来说,默认情况下 RGB 三个颜色平面会被独立处理后再合并成新的特征映射集合。
#### 数据预处理与加载
为了让模型能够接受正确的数据格式,在训练之前还需要做好适当的数据准备工作。这包括但不限于调整分辨率至固定大小、归一化像素值范围等步骤。以下是一段有关 CIFAR-10 数据集读取的例子:
```python
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
transform = transforms.Compose([
transforms.ToTensor(), # 将 PIL Image 或 numpy.ndarray 转换为 tensor 并缩放到 [0., 1.] 区间内
transforms.Normalize((0.5,), (0.5,)) # 对每个 channel 应用标准化 z-score normalization
])
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(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=64, shuffle=False)
```
这里我们采用了标准库 `transforms` 来简化这些常见转换过程[^4]。
#### 开始训练流程
最后就是编写循环脚本来执行前向传播、反向梯度更新等一系列必要动作啦!
```python
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters())
for epoch in range(num_epochs):
running_loss = 0.0
for i, data in enumerate(train_loader, start=0):
inputs, labels = data[0].to(device), data[1].to(device)
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)}")
```
以上即是在 PyTorch 下运用 CNN 实现基本图像识别功能的整体框架介绍。
阅读全文
相关推荐


















