第四章:模型搭建准备——环境、数据与选型

好,咱们进入正题。模型搭建这事儿,说白了就三步:把锅架好(环境)、把菜洗好切好(数据)、决定今天做川菜还是粤菜(选型)。这三步走扎实了,后面训练模型才不会翻车。

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 知识体系总览

下面这张图,是我梳理的本章知识结构。你把它存下来,后面搭建模型时对照着看。

模型搭建准备:知识体系 环境配置 数据预处理 模型选型 PyTorch 环境 TensorFlow 环境 GPU/CUDA 配置 数据集加载 归一化/标准化 数据增强 CNN(图像) RNN/LSTM(序列) Transformer(通用) 核心原则:先跑通,再优化 环境稳定 → 数据干净 → 模型匹配任务

4.5 本章小结

嗯,内容不少,但核心就三件事:

  • 环境:PyTorch 适合研究和快速迭代,TensorFlow 适合生产部署。选一个就行,别两个都装,容易乱。
  • 数据:预处理比模型更重要。我见过太多人花 80% 时间调模型,却只花 20% 时间处理数据。方向反了。
  • 选型:CNN 做图像,RNN 做序列,Transformer 通吃。但记住——简单模型能解决的问题,别上复杂的。

最后一句:模型搭建就像做饭。环境是灶台,数据是食材,选型是菜谱。灶台不稳、食材不新鲜,再好的菜谱也白搭。动手吧,别光看。

专注资料整理