1. 模型测试:评估网络性能

在深度学习项目中,模型测试是评估训练好的神经网络在实际数据上表现的关键步骤。以下代码展示了如何对CIFAR-10分类模型进行测试:

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        images, labels = images.to(device), labels.to(device)
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

关键知识点:

torch.no_grad():禁用梯度计算,节省内存和计算资源

torch.max(outputs.data, 1):返回每行最大值的索引,即预测类别

批量处理:利用labels.size(0)获取当前批次的样本数量

测试结果显示模型整体准确率为66%,这为我们提供了模型性能的总体评估。

2. 类别级精度分析

为了更深入了解模型表现,我们需要分析每个类别的分类精度:

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
    for data in testloader:
        images, labels = data
        images, labels = images.to(device), labels.to(device)
        outputs = net(images)
        _, predicted = torch.max(outputs, 1)
        c = (predicted == labels).squeeze()
        for i in range(4):  # 假设批次大小为4
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1

for i in range(10):
    print('Accuracy of %5s : %2d %%' % (
        classes[i], 100 * class_correct[i] / class_total[i]))

分析结果:

车辆识别准确率最高:82%

猫的识别准确率最低:45%

这种不均衡的性能表明模型对某些类别学习不够充分

3. 模型优化:全局平均池化

第二个代码展示了如何使用全局平均池化(Global Average Pooling)优化网络结构:

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, 5)
        self.pool1 = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(16, 36, 5)
        self.pool2 = nn.MaxPool2d(2, 2)
        # 使用全局平均池化层
        self.aap = nn.AdaptiveAvgPool2d(1)
        self.fc3 = nn.Linear(36, 10)
    
    def forward(self, x):
        x = self.pool1(F.relu(self.conv1(x)))
        x = self.pool2(F.relu(self.conv2(x)))
        x = self.aap(x)  # 全局平均池化
        x = x.view(x.shape[0], -1)  # 展平
        x = self.fc3(x)
        return x

全局平均池化的优势:

参数大幅减少:传统全连接层需要大量参数,而GAP显著降低参数量

防止过拟合:减少参数降低了过拟合风险

空间信息整合:将特征图直接转换为特征向量,保留重要信息

该优化后的模型仅有16,022个参数,相比传统架构参数量大为减少。

4. 实践总结

通过这两个代码示例,我们学到了:

  1. 全面的模型评估:不仅要看整体准确率,还要分析每个类别的表现

  2. 测试技巧:使用torch.no_grad()提高测试效率

  3. 模型优化策略:全局平均池化是减少参数、防止过拟合的有效方法

  4. 代码调试:注意代码中的拼写错误(如inages应为images

这些技术对于构建高效、准确的深度学习模型至关重要,特别是在计算资源有限的环境中,全局平均池化等优化技术显得尤为宝贵。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐