和鲸社区深度学习基础训练营2025年关卡4

使用 pytorch 构建一个简单的卷积神经网络(CNN)模型,完成对 CIFAR-10 数据集的图像分类任务。 直接使用 CNN 进行分类的模型性能。 提示: 数据集:CIFAR-10 网络结构:可以使用 2-3 层卷积层,ReLU 激活,MaxPooling 层,最后连接全连接层。

复制代码
#1. 数据预处理与加载
import torch
import torchvision
import torchvision.transforms as transforms

# 数据增强与归一化(使用CIFAR-10官方均值和标准差)
transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),       # 随机裁剪增强泛化性
    transforms.RandomHorizontalFlip(),          # 随机水平翻转
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616))
])

transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616))
])

# 加载数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)

# 数据加载器
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)

#2. CNN模型架构
import torch.nn as nn
import torch.nn.functional as F

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, 3, padding=1)  # 输入通道3(RGB),输出32通道
        self.bn1 = nn.BatchNorm2d(32)                 # 批量归一化
        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
        self.bn2 = nn.BatchNorm2d(64)
        self.conv3 = nn.Conv2d(64, 128, 3, padding=1)
        self.bn3 = nn.BatchNorm2d(128)
        self.pool = nn.MaxPool2d(2, 2)                # 池化层(尺寸减半)
        self.fc1 = nn.Linear(128 * 4 * 4, 256)       # 全连接层(输入尺寸计算:32x32 → 16x16 → 8x8 → 4x4)
        self.fc2 = nn.Linear(256, 10)                 # 输出10类

    def forward(self, x):
        x = self.pool(F.relu(self.bn1(self.conv1(x))))  # 32x32 → 16x16
        x = self.pool(F.relu(self.bn2(self.conv2(x))))  # 16x16 → 8x8
        x = self.pool(F.relu(self.bn3(self.conv3(x))))  # 8x8 → 4x4
        x = x.view(-1, 128 * 4 * 4)                    # 展平
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 实例化模型并移至GPU(若可用)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net = SimpleCNN().to(device)

#3. 训练与优化
import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)  # 每5轮学习率×0.1

# 训练循环(10个epoch)
for epoch in range(10):
    net.train()
    running_loss = 0.0
    for i, (inputs, labels) in enumerate(trainloader):
        inputs, labels = inputs.to(device), labels.to(device)
        
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()
        if i % 100 == 99:  # 每100批次打印一次
            print(f'Epoch [{epoch+1}/10], Step [{i+1}/{len(trainloader)}], Loss: {running_loss/100:.3f}')
            running_loss = 0.0
    
    scheduler.step()  # 更新学习率
    print(f"Epoch {epoch+1} completed, learning rate: {scheduler.get_last_lr()[0]:.6f}")

#4. 模型评估与可视化
net.eval()
correct, total = 0, 0
with torch.no_grad():
    for (images, labels) in testloader:
        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()

accuracy = 100 * correct / total
print(f'Test Accuracy: {accuracy:.2f}%')

运行结果:

相关推荐
朴马丁2 分钟前
从制造到智造:国产PLM如何赋能化工新材料企业研发创新
大数据·人工智能·制造·流程行业plm·化工新材料行业
AI棒棒牛5 分钟前
YOLO26 全网独家改进创新:ECCV2026 PriorEye 主干网络改进,引入视觉-空间先验门控 Backbone,复杂场景涨点新思路!
人工智能·神经网络·目标检测·yolo26
天赐印记9 分钟前
从 Hexo 到前后端,再到现在这个「不用伺候服务器」的个人站
人工智能·程序员
AI 小老六9 分钟前
Agent 评测系统架构:从指标分层到 GT/Judge 闭环的工程化落地
人工智能·ai·架构·系统架构·可用性测试
谢尔登13 分钟前
通过Semi Design思考前端组件AI化
前端·人工智能
刘一说17 分钟前
AI科技热点日报 | 2026年7月8日
人工智能·科技
她的男孩19 分钟前
当 Spring Boot 遇上 Flowable 7:Forge 框架企业级工作流引擎架构全解析
人工智能·后端·程序员
HackTwoHub26 分钟前
ARL灯塔重构版:支持APP/小程序/WEB资产同步扫描
人工智能·安全·web安全·网络安全·小程序·重构·自动化
KaMeidebaby28 分钟前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀29 分钟前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法