当前位置: 首页 > news >正文

实训题

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from multiprocessing import freeze_support
import sys

def load_data():
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

trainset = torchvision.datasets.CIFAR10(
root='./data',
train=True,
download=True,
transform=transform
)
trainloader = torch.utils.data.DataLoader(
trainset,
batch_size=4,
shuffle=True,
num_workers=2
)

testset = torchvision.datasets.CIFAR10(
root='./data',
train=False,
download=True,
transform=transform
)
testloader = torch.utils.data.DataLoader(
testset,
batch_size=4,
shuffle=False,
num_workers=2
)

classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

return trainloader, testloader, classes

class Net(nn.Module):
def init(self):
super().init()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = self.pool(torch.relu(self.conv2(x)))
x = torch.flatten(x, 1) # 展平
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x

def compile_model(net):
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
return criterion, optimizer

def train(net, trainloader, criterion, optimizer, device, epochs=2):
for epoch in range(epochs):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data

核心:数据与模型设备同步
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 % 2000 == 1999:  # 每2000个batch打印一次print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')running_loss = 0.0

print('训练完成')

def test(net, testloader, classes, device):
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(f'测试集整体准确率: {100 * correct // total} %')

按类别统计准确率
correct_pred = {classname: 0 for classname in classes}
total_pred = {classname: 0 for classname in classes}

with torch.no_grad():
for data in testloader:
images, labels = data
images, labels = images.to(device), labels.to(device)
outputs = net(images)
_, predictions = torch.max(outputs, 1)

统计每个类别的预测结果

for label, prediction in zip(labels, predictions):
if label == prediction:
correct_pred[classes[label]] += 1
total_pred[classes[label]] += 1

打印各类别准确率
for classname, correct_count in correct_pred.items():
accuracy = 100 * float(correct_count) / total_pred[classname]
print(f'类别: {classname:5s} 准确率: {accuracy:.1f} %')
if name == 'main':
freeze_support() # 解决Windows多进程问题

自动选择设备(有GPU用GPU,无则用CPU)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"当前使用设备: {device}")

加载数据、初始化模型和优化器
trainloader, testloader, classes = load_data()
net = Net().to(device) # 模型放到指定设备
criterion, optimizer = compile_model(net)

重定向输出到文件,同时保留控制台打印
original_stdout = sys.stdout
with open('cifar10_result.txt', 'w') as f:
sys.stdout = f
print(f"当前使用设备: {device}")
train(net, trainloader, criterion, optimizer, device)
test(net, testloader, classes, device)
sys.stdout = original_stdout # 恢复控制台输出

print("训练完成!结果已保存到 cifar10_result.txt ")

http://www.zskr.cn/news/22861.html

相关文章:

  • GoodSync 2025年10月17日
  • 书本p66实训题第2题
  • springboot 上传图片到服务器之后,前段不能正确加载图片问题
  • 深入解析:云原生时代的数据流高速公路:深入解剖Apache Pulsar的架构设计哲学
  • DeepResearch代码浅析
  • 2025年10月中国专精特新申报服务机构推荐榜:五强实测
  • 静态初始化块的执行顺序
  • 10.16 CSP-S 模拟赛总结
  • 远程无钥匙进入(PKE)技术:便利与安全的完美融合
  • 灵动岛iPhone状态栏获得高度不对 iOS iPhone14pro iPhone14pro max状态栏获得高度不对
  • 别被波形“骗” 了!差分探头与无源探头测量不一致的 5 大关键因素
  • 2025年信息流代运营服务商权威推荐榜单:专业投放策略与效果优化服务口碑之选
  • 【Prompt学习技能树地图】单一思维链优化-自我一致性提示工程原理、实践与代码实现 - 教程
  • 基于MATLAB的倒立摆控制实现方案
  • 数据迁移mysql--sr
  • 2025 西安楼盘最新推荐排行榜:聚焦优质教育配套的品质楼盘精选高端/刚需/品牌/现房/优质楼盘推荐
  • Android-MVX工艺总结
  • volcano源码阅读——action/enqueue
  • 2025年工业大吊扇厂家权威推荐榜:大型厂房通风降温设备源头企业综合实力与客户口碑深度解析
  • 【左扬精讲】SRE 别慌!我用 故障预测与诊断,性能评估与优化,资源分配与规划 讲概率与贝叶斯算法的实战应用,都是咱运维人能懂的话(含代码)
  • 学校社团招新的题目(莫队+树状数组统计区间逆序对个数)(蒟蒻被薄纱QAQ)
  • 2025 年 PP 管厂家最新推荐榜:全面甄选优质 pp 风管、PP 喷淋塔等产品厂家,助力实验室场景精准选型
  • MyEMS:衔接 “双控” 政策与企业实践的开源能源管理利器
  • 2025 电动轮椅厂家最新推荐榜:深度解析智能轻便 / 长续航 / 高安全国产优质品牌核心优势
  • 2025年信息流代运营服务商权威推荐榜单:专业投放策略与高效转化服务口碑之选
  • 一些框架
  • 微调 - Lora
  • 2025年轮胎厂家权威推荐榜:舒适轮胎,耐磨轮胎,高性能轮胎与静音轮胎全系列选购指南
  • RTP推流测试
  • 2025 年板材厂家最新推荐排行榜:涵盖环保、密度、净化、零醛添加等类型,胖胖熊等优质品牌详细解析