卷积神经网络入门与实践
立即解锁
发布时间: 2025-09-01 01:57:32 阅读量: 5 订阅数: 23 AIGC 

### 卷积神经网络入门与实践
#### 卷积与池化的特性
当图像向左平移 1 个像素时,经过卷积、激活和池化操作后,图像的维度会因池化而降低,这意味着较少的像素存储了原始图像的大部分信息。由于池化存储的是区域信息,即使原始图像平移 1 个单位,池化图像中像素的信息也不会改变,因为该区域的最大值很可能会被捕获到池化图像中。
卷积和池化还能帮助我们处理感受野。例如,对一个 100x100 的图像进行两次卷积 + 池化操作(卷积时使用填充),最终输出的形状为 25x25。此时,25x25 输出中的每个单元对应原始图像中一个更大的 4x4 部分。因此,通过卷积和池化操作,结果图像中的每个单元都包含了原始图像中一个区域的关键信息。
#### 实现卷积神经网络
以下是使用 PyTorch 在一个玩具数据集上构建和训练 CNN 模型的详细步骤:
1. **导入相关库**:
```python
import torch
from torch import nn
from torch.utils.data import TensorDataset, Dataset, DataLoader
from torch.optim import SGD, Adam
device = 'cuda' if torch.cuda.is_available() else 'cpu'
from torchvision import datasets
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
```
2. **创建数据集**:
```python
X_train = torch.tensor([[[[1,2,3,4],[2,3,4,5],
[5,6,7,8],[1,3,4,5]]],
[[[-1,2,3,-4],[2,-3,4,5],
[-5,6,-7,8],[-1,-3,-4,-5]]]]).to(device).float()
X_train /= 8
y_train = torch.tensor([0,1]).to(device).float()
```
这里将输入数据集进行缩放,使其范围在 -1 到 +1 之间,输入数据集的形状为 (2,1,4,4)。
3. **定义模型架构**:
```python
def get_model():
model = nn.Sequential(
nn.Conv2d(1, 1, kernel_size=3),
nn.MaxPool2d(2),
nn.ReLU(),
nn.Flatten(),
nn.Linear(1, 1),
nn.Sigmoid(),
).to(device)
loss_fn = nn.BCELoss()
optimizer = Adam(model.parameters(), lr=1e-3)
return model, loss_fn, optimizer
```
在这个模型中,输入有 1 个通道,卷积后输出也提取 1 个通道(即使用 1 个 3x3 的滤波器)。损失函数使用二元交叉熵损失(nn.BCELoss),优化器使用 Adam,学习率为 0.001。
4. **总结模型架构**:
```python
!pip install torch_summary
from torchsummary import summary
model, loss_fn, optimizer = get_model()
summary(model, X_train);
```
各层参数数量分析如下:
| 层 | 参数数量计算 | 总参数数量 |
| --- | --- | --- |
| Conv2d | 9 个权重参数(3x3) + 1 个偏置 = 10 个参数 | 10 |
| MaxPool2d、ReLU、Flatten | 无权重和偏置,参数数量为 0 | 0 |
| Linear | 1 个权重 + 1 个偏置 = 2 个参数 | 2 |
| 总计 | - | 12 |
5. **训练模型**:
- **定义训练批次函数**:
```python
def train_batch(x, y, model, opt, loss_fn):
model.train()
prediction = model(x)
batch_loss = loss_fn(prediction.squeeze(0), y)
batch_loss.backward()
optimizer.step()
optimizer.zero_grad()
return batch_loss.item()
```
- **定义训练数据加载器**:
```python
trn_dl = DataLoader(TensorDataset(X_train, y_train))
```
- **训练模型 2000 个 epoch**:
```python
for epoch in range(2000):
for ix, batch in enumerate(iter(trn_dl)):
x, y = batch
batch_loss = train_batch(x, y, model, optimizer, loss_fn)
```
6. **对第一个数据点进行前向传播**:
```python
model(X_train[:1])
```
输出结果为 0.1625。
#### 卷积神经网络在图像分类中的应用
传统神经网络在处理平移图像时预测不准确,而 CNN 可以解决这个问题。以下是在 Fashion - MNIST 数据集上的应用步骤:
1. **导入必要的包**:
```python
from torchvision import datasets
from torch.utils.data import Dataset, DataLoader
import torch
import torch.nn as nn
device = "cuda" if torch.cuda.is_available() else "cpu"
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
```
2. **获取数据集**:
```python
data_folder = '~/data/FMNIST'
fmnist = datasets.FashionMNIST(data_folder, download=True, train=True)
tr_images = fmnist.data
tr_targets = fmnist.targets
```
3. **定义数据集类**:
```python
class FMNISTDataset(Dataset):
def __init__(self, x, y):
x = x.float()/255
x = x.view(-1,1,28,28)
self.x, self.y = x, y
def __getitem__(self, ix):
x, y = self.x[ix], self.y[ix]
return x.to(device), y.to(device)
def __len__(self):
return len(self.x)
```
4. **定义 CNN 模型架构**:
```python
from torch.optim import SGD, Adam
def get_model():
model = nn.Sequential(
nn.Conv2d(1, 64, kernel_siz
```
0
0
复制全文
相关推荐









