深度学习入门:神经网络原理与 PyTorch 实战
1. 神经网络基础
神经网络结构:
├── 输入层:接收原始特征
├── 隐藏层:提取特征(可多层)
├── 输出层:产生预测结果
└── 激活函数:引入非线性
常见激活函数:
├── Sigmoid: σ(x) = 1/(1+e^(-x)),输出 (0,1)
├── Tanh: tanh(x),输出 (-1,1)
├── ReLU: max(0,x),最常用
├── LeakyReLU: max(0.01x, x)
└── Softmax: 多分类输出概率
2. PyTorch 基础
import torch
import torch.nn as nn
import torch.optim as optim
# 创建张量
x = torch.randn(3, 4) # 随机张量
y = torch.zeros(3, 4) # 零张量
z = torch.ones(3, 4) # 全 1 张量
# GPU 加速
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = x.to(device)
3. 构建神经网络
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(hidden_size, hidden_size),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(hidden_size, output_size)
)
def forward(self, x):
return self.layers(x)
# 创建模型
model = SimpleNN(784, 256, 10).to(device)
print(model)
4. 训练循环
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# 数据准备
dataset = TensorDataset(X_train_tensor, y_train_tensor)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练
for epoch in range(100):
model.train()
total_loss = 0
for batch_X, batch_y in dataloader:
batch_X, batch_y = batch_X.to(device), batch_y.to(device)
# 前向传播
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
if (epoch + 1) % 10 == 0:
print(f"Epoch {epoch+1}, Loss: {total_loss/len(dataloader):.4f}")
5. 模型评估
# 评估模式
model.eval()
with torch.no_grad():
outputs = model(X_test_tensor.to(device))
predictions = outputs.argmax(dim=1).cpu()
accuracy = (predictions == y_test_tensor).float().mean()
print(f"准确率: {accuracy:.4f}")
6. CNN 图像分类
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(64, 128, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(128 * 4 * 4, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, num_classes)
)
def forward(self, x):
x = self.features(x)
x = self.classifier(x)
return x
7. 模型保存与加载
# 保存
torch.save(model.state_dict(), 'model.pth')
# 加载
model = SimpleNN(784, 256, 10)
model.load_state_dict(torch.load('model.pth'))
model.eval()
总结
| 概念 |
说明 |
| 前向传播 |
输入 → 输出 |
| 反向传播 |
计算梯度 |
| 优化器 |
SGD/Adam/AdamW |
| 损失函数 |
CrossEntropy/MSE |
| 正则化 |
Dropout/BatchNorm |