深度学习核心网络架构详解:从 CNN 到 LSTM
深度学习领域中,不同的网络架构适用于处理各种复杂的任务。本文将深入探讨几种必须掌握的核心网络架构,包括卷积神经网络 (CNN)、循环神经网络 (RNN) 及其变体长短时记忆网络 (LSTM) 和门控循环单元 (GRU),并结合具体案例和代码实现进行详细讲解。
一、卷积神经网络 (CNN)
1. 基本原理
卷积神经网络 (Convolutional Neural Network, CNN) 是专为处理具有网格结构数据(如图像)而设计的深度学习模型。其核心思想是通过卷积操作自动提取数据的局部特征,减少参数数量,提高训练效率。
CNN 的主要组件包括:
- 卷积层 (Convolutional Layer):使用卷积核提取特征
- 激活函数 (Activation Function):引入非线性特性
- 池化层 (Pooling Layer):降低特征维度
- 全连接层 (Fully Connected Layer):进行分类或回归
2. 案例:MNIST 手写数字识别
下面是一个使用 PyTorch 实现的 CNN 模型,用于识别 MNIST 数据集中的手写数字:
python
运行
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,)) # MNIST数据集的均值和标准差
])# 加载训练集和测试集
train_dataset = datasets.MNIST('data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('data', train=False, transform=transform)train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1000)# 定义CNN模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=5) # 输入通道1,输出通道10self.conv2 = nn.Conv2d(10, 20, kernel_size=5) # 输入通道10,输出通道20self.conv2_drop = nn.Dropout2d() # Dropout层,防止过拟合self.fc1 = nn.Linear(320, 50) # 全连接层self.fc2 = nn.Linear(50, 10) # 输出层,10个类别def forward(self, x):x = nn.functional.relu(nn.functional.max_pool2d(self.conv1(x), 2))x = nn.functional.relu(nn.functional.max_pool2d(self.conv2_drop(self.conv2(x)), 2))x = x.view(-1, 320) # 展平为一维向量x = nn.functional.relu(self.fc1(x))x = nn.functional.dropout(x, training=self.training)x = self.fc2(x)return nn.functional.log_softmax(x, dim=1)# 初始化模型、损失函数和优化器
model = CNN()
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
def train(model, train_loader, optimizer, epoch):model.train()for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} 'f'({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')# 测试模型
def test(model, test_loader):model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:output = model(data)test_loss += criterion(output, target).item()pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} 'f'({100. * correct / len(test_loader.dataset):.2f}%)\n')# 训练模型
for epoch in range(1, 5):train(model, train_loader, optimizer, epoch)test(model, test_loader)
3. 模型解析
这个 CNN 模型的结构如下:
- 第一个卷积层:接收 1 通道的 28×28 图像ÿ