趋近智
训练深度学习 (deep learning)模型是它从数据中学习的主要步骤。此过程始于模型定义好其层和激活函数 (activation function),并用指定的损失函数 (loss function)(用于衡量误差)和优化器(如 Adam 或 SGD,用于指导权重 (weight)更新)编译完成。训练涉及向模型提供准备好的数据,让优化器迭代地调整权重,以最小化选定的损失函数。
训练神经网络 (neural network)本质上是一个迭代过程。我们并非只向模型展示数据一次。相反,我们反复地让它接触数据,使其逐步掌握基本规律。每次迭代包含以下几个步骤:
这个循环对许多数据批次重复进行。
深度学习框架提供了方便的方式来管理这个训练循环。在 Keras 中,这通常通过一个名为 fit 的方法完成。在 PyTorch 中,你通常需要明确地编写循环,从而提供更精细的控制。无论具体的实现如何,核心思想保持不变,你需要指定几个重要参数:
这是模型将学习的输入数据(X_train)和相应的目标标签(y_train)。我们假设这些数据已按前述内容进行了预处理(例如,缩放、重塑)。
一个周期代表对整个训练数据集的一次完整遍历。如果你的数据集有 10,000 个样本,并且你训练 10 个周期,模型在训练期间将看到每个样本 10 次(尽管可能在不同的批次和顺序中)。
选择周期数很重要:
为了避免在每次权重 (weight)更新时一次性处理整个数据集(这对于大型数据集而言计算上不可行),我们通常将训练数据分成更小的块,称为小批次。批次大小定义了在模型权重更新之前,每个前向/反向传播 (backpropagation)中处理的训练样本数量。
批次大小的选择影响:
一个周期涉及处理整个数据集,通常会分割成小批次。对于每个批次,模型会执行前向传播,计算损失,执行反向传播,并通过优化器更新其权重。这个循环在周期内的所有批次中重复进行,然后重复多个周期。
让我们看看这在 PyTorch 中是如何呈现的。假设你拥有 model、criterion(损失函数 (loss function),例如 nn.CrossEntropyLoss)、optimizer(例如 optim.Adam)以及一个 train_loader(一个提供数据批次的 DataLoader)。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# 假设这些在其他地方定义:
# model: 你的神经网络模型 (nn.Module 的子类)
# criterion: 你的损失函数 (例如, nn.CrossEntropyLoss())
# optimizer: 你的优化器 (例如, optim.Adam(model.parameters(), lr=0.001))
# X_train_tensor, y_train_tensor: 作为 PyTorch 张量的训练数据
# device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 如果可能,在 GPU 上运行
# --- 超参数 ---
BATCH_SIZE = 64
NUM_EPOCHS = 10
# --- 准备 DataLoader ---
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
# shuffle=True 对于训练很重要,可确保每个周期批次不同
train_loader = DataLoader(dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True)
# 将模型移动到正确的设备(CPU 或 GPU)
# model.to(device)
# --- 训练循环 ---
model.train() # 将模型设置为训练模式(对 Dropout、BatchNorm 等层很重要)
print("开始训练...")
for epoch in range(NUM_EPOCHS):
running_loss = 0.0
num_batches = len(train_loader)
for i, batch in enumerate(train_loader):
# 1. 从批次获取数据并移动到设备
# inputs, labels = batch[0].to(device), batch[1].to(device)
inputs, labels = batch # 为简单起见,假设数据已在正确设备或 CPU 上
# 2. 将参数梯度清零(在反向传播前必不可少)
optimizer.zero_grad()
# 3. 前向传播:计算预测
outputs = model(inputs)
# 4. 计算损失
loss = criterion(outputs, labels)
# 5. 反向传播:计算梯度
loss.backward()
# 6. 优化:根据梯度更新权重
optimizer.step()
# 累加损失用于报告
running_loss += loss.item() # .item() 从损失张量中获取标量值
# 可选:定期打印进度
if (i + 1) % 100 == 0 or (i + 1) == num_batches: # 每 100 个小批次或在周期结束时打印
print(f'Epoch [{epoch + 1}/{NUM_EPOCHS}], Batch [{i + 1}/{num_batches}], Loss: {loss.item():.4f}')
# 注意:对于运行平均损失:{running_loss / (i + 1):.4f}
epoch_loss = running_loss / num_batches
print(f'Epoch [{epoch + 1}/{NUM_EPOCHS}] completed. Average Loss: {epoch_loss:.4f}')
print('训练完成')
# --- Keras 等效代码 ---
# 为作比较,Keras 的等效代码封装了此循环:
# history = model.fit(X_train_tensor.numpy(), y_train_tensor.numpy(),
# epochs=NUM_EPOCHS,
# batch_size=BATCH_SIZE,
# shuffle=True,
# verbose=2) # verbose 控制打印信息的详细程度
# print('训练完成')
这个 PyTorch 循环明确执行了前面列出的步骤:为每个批次清零梯度、前向传播、损失计算、反向传播 (backpropagation)和优化器步进。外层循环遍历指定数量的周期。设置 model.train() 很重要,因为某些层在训练和评估期间表现不同。Keras 将此循环抽象为 model.fit() 调用,根据你提供的 epochs 和 batch_size 参数 (parameter),在内部管理批次迭代、混洗和更新。
执行这个训练循环(无论是显式地还是通过 fit 这样的方法)就是学习发生的地方。模型的参数根据训练数据进行调整,目标是使损失函数最小化。然而,仅仅运行循环是不够的。我们需要观察训练的进展情况,以便做出明智的决策。下一节将介绍如何在训练期间监控损失和准确率等指标,以了解模型行为并诊断潜在问题。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•