第四章:模型搭建准备——环境、数据与选型
好,咱们进入正题。模型搭建这事儿,说白了就三步:把锅架好(环境)、把菜洗好切好(数据)、决定今天做川菜还是粤菜(选型)。这三步走扎实了,后面训练模型才不会翻车。
4.1 环境配置:PyTorch vs TensorFlow
我个人习惯用 PyTorch,原因很简单——调试方便,社区活跃。但 TensorFlow 在生产部署上确实有优势。你想想看,选哪个其实取决于你的场景。
核心原则:别纠结框架,先跑起来再说。
4.1.1 PyTorch 环境搭建
我建议用 conda 管理环境,干净利落。曾经有个项目,我直接在 base 环境里装包,结果依赖冲突搞得我怀疑人生。从那以后,每个项目我都新建一个环境。
# 创建环境
conda create -n myenv python=3.9
conda activate myenv
# 安装 PyTorch(根据 CUDA 版本选择)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 验证安装
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
小技巧:如果你不确定 CUDA 版本,用 nvidia-smi 看一眼。我遇到过有人装了 CUDA 12 的 PyTorch,结果机器是 CUDA 11,白白浪费半天时间。
4.1.2 TensorFlow 环境搭建
TensorFlow 2.x 现在跟 Keras 深度整合,上手门槛低了不少。不过要注意,TF 对 GPU 的支持有时候挺坑的。
# 安装 TensorFlow
pip install tensorflow
# 验证 GPU 是否可用
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
注意:TensorFlow 2.10 是最后一个原生支持 Windows GPU 的版本。2.11 之后,Windows 用户得用 WSL2。嗯,这里要注意,别踩坑。
4.2 数据集加载与预处理
数据预处理占了我整个项目时间的 60% 以上。真的,别小看这一步。模型再牛,喂进去的是垃圾,出来的还是垃圾。
4.2.1 常见数据集加载方式
| 框架 | 内置数据集 | 自定义数据集 |
|---|---|---|
| PyTorch | torchvision.datasets | torch.utils.data.Dataset |
| TensorFlow | tf.keras.datasets | tf.data.Dataset |
举个例子,加载 CIFAR-10:
# PyTorch 方式
from torchvision import datasets, transforms
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True)
# TensorFlow 方式
import tensorflow as tf
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
x_train = x_train.astype('float32') / 255.0
我的经验:数据归一化一定要做。我曾经有个图像分类项目,忘了归一化,模型 loss 死活降不下去。折腾了两天才发现是数据范围的问题。你说冤不冤?
4.2.2 数据增强
数据不够?增强来凑。说白了就是给数据「化妆」,让模型见过更多花样。
# PyTorch 数据增强
transform_train = transforms.Compose([
transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(brightness=0.2, contrast=0.2),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
# TensorFlow 数据增强
data_augmentation = tf.keras.Sequential([
tf.keras.layers.RandomFlip("horizontal"),
tf.keras.layers.RandomRotation(0.1),
tf.keras.layers.RandomZoom(0.1),
])
4.3 基础模型选型:CNN / RNN / Transformer
选模型就像选工具。你总不能拿锤子去拧螺丝吧?
4.3.1 CNN:图像任务的标配
CNN 的核心就是卷积核。它通过滑动窗口提取局部特征,说白了就是「看局部,拼整体」。
# 一个简单的 CNN 模型(PyTorch)
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc = nn.Linear(32 * 8 * 8, 10)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = self.pool(torch.relu(self.conv2(x)))
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
适用场景:图像分类、目标检测、图像分割。别拿 CNN 去做文本分类,虽然也能做,但效果一般。
4.3.2 RNN:序列数据的利器
RNN 的特点是「有记忆」。它会把上一个时间步的信息传到下一个。但有个问题——长序列下容易梯度消失。LSTM 和 GRU 就是来解决这个问题的。
# 一个简单的 LSTM 模型(TensorFlow)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
model = Sequential([
LSTM(64, input_shape=(100, 50), return_sequences=True),
LSTM(32),
Dense(10, activation='softmax')
])
避坑指南:我曾经用普通 RNN 做股票预测,序列长度超过 50 步,结果模型完全学不动。换成 LSTM 后,效果立竿见影。记住,长序列别用 vanilla RNN。
4.3.3 Transformer:当红炸子鸡
Transformer 最初是为 NLP 设计的,但现在 CV 领域也被它攻占了。它的核心是自注意力机制——说白了就是让模型自己决定「该看哪里」。
# 一个简单的 Transformer 编码器层(PyTorch)
from torch.nn import TransformerEncoderLayer
encoder_layer = TransformerEncoderLayer(
d_model=512, # 嵌入维度
nhead=8, # 注意力头数
dim_feedforward=2048,
dropout=0.1
)
我的建议:如果你做 NLP 任务,直接上 Transformer。如果是图像任务,小数据集用 CNN,大数据集(百万级)可以考虑 ViT(Vision Transformer)。
4.4 知识体系总览
下面这张图,是我梳理的本章知识结构。你把它存下来,后面搭建模型时对照着看。
4.5 本章小结
嗯,内容不少,但核心就三件事:
- 环境:PyTorch 适合研究和快速迭代,TensorFlow 适合生产部署。选一个就行,别两个都装,容易乱。
- 数据:预处理比模型更重要。我见过太多人花 80% 时间调模型,却只花 20% 时间处理数据。方向反了。
- 选型:CNN 做图像,RNN 做序列,Transformer 通吃。但记住——简单模型能解决的问题,别上复杂的。
最后一句:模型搭建就像做饭。环境是灶台,数据是食材,选型是菜谱。灶台不稳、食材不新鲜,再好的菜谱也白搭。动手吧,别光看。