一、可复用代码

1.1 训练代码

def train(model, device, train_loader, optimizer, criterion):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
    return loss.item()  
def test(model, device, test_loader, criterion):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            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)
    accuracy =  correct / len(test_loader.dataset)
    return accuracy, test_loss  
for epoch in range(1, 11):
    train_loss = train(net, device, train_loader, optimizer, criterion)
    train_losses.append(train_loss)
    train_correct = 0
    train_total = 0
    with torch.no_grad():
        for data, target in train_loader:
            data, target = data.to(device), target.to(device)
            output = net(data)
            _, predicted = torch.max(output, 1)
            train_total += target.size(0)
            train_correct += (predicted == target).sum().item()
    train_accuracy = train_correct / train_total
    train_accuracies.append(train_accuracy)
    test_accuracy, test_loss = test(net, device, test_loader, criterion)
    test_accuracies.append(test_accuracy)

    print(f"Epoch [{epoch}/{10}], Loss: {train_loss:.4f}, Train Accuracy: {train_accuracy:.4f}, Test Accuracy: {test_accuracy:.4f}")

1.2 画图

import matplotlib.pyplot as plt

# 绘制 Loss 图
plt.figure(figsize=(10, 5))
plt.plot(train_losses, label='Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss vs. Epoch')
plt.legend()
plt.grid()
plt.show()

# 绘制 Accuracy 图
plt.figure(figsize=(10, 5))
plt.plot(train_accuracies, label='Training Accuracy', marker='o')
plt.plot(test_accuracies, label='Testing Accuracy', marker='x')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Accuracy vs. Epoch')
plt.legend()
plt.grid()
plt.show()

1.3 清华源

https://pypi.tuna.tsinghua.edu.cn/simple/    .

二、补充数学知识

2.1 计算复杂度

具体分配示例(100%制)

阶段时间占比算力占用说明
数据加载与预处理5%CPU为主初始加载和转换数据,可能被异步掩盖。
训练-前向传播30%GPU(核心计算)包括所有层的正向计算。
训练-反向传播与梯度60%GPU(核心计算)计算梯度,占用最多算力。
训练-参数更新1%GPU(轻量计算)优化器更新参数,时间极短。
测试集预测4%GPU(核心计算)仅前向传播,时间随测试频率增加。

关键影响因素

  • 数据加载优化:使用多进程和内存缓存可减少时间。
  • 模型复杂度:深层网络反向传播时 间显著增加。
  • Batch Size:大批量提高GPU利用率,但可能增加内存压力。
  • 测试频率:每个epoch都测试会累积更多时间。

2.2 凸函数

凸函数:一个函数 f:Rn→R 被称为凸函数,如果对于任意两个点 x,y∈Rn 和任意的 θ∈[0,1],满足:

几何意义

  • 直观理解:凸函数的形状像一个“碗”,即从任意两点画一条直线,这条直线始终在函数图像的上方或与图像重合。这种性质保证了局部最优解就是全局最优解。

  • 损失函数:许多深度学习中的损失函数(如均方误差、交叉熵损失)是凸函数。凸损失函数保证了优化过程更容易找到全局最优解,而不是陷入局部最优。

  • 优化算法:凸函数的性质使得梯度下降等优化算法在优化凸目标函数时具有更好的收敛性。对于凸函数,梯度下降法通常能够保证收敛到全局最优解。

  • 正则化:在深度学习中,正则化项(如 L1 和 L2 正则化)通常是凸函数。这些正则化项可以帮助防止过拟合,同时保持优化问题的凸性。

注意事项

  • 非凸函数:许多目标函数(如神经网络的损失函数)是非凸的,它们可能存在多个局部最优解。

更多推荐