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

书本p66实训题第2题

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

数据预处理

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')

定义网络模型

class Net(nn.Module):
def init(self):
super(Net, self).init()
self.conv1 = nn.Conv2d(3, 6, 5) # 卷积层1,输入通道3,输出通道6,卷积核大小5
self.pool = nn.MaxPool2d(2, 2) # 最大池化层,池化核大小2,步长2
self.conv2 = nn.Conv2d(6, 16, 5) # 卷积层2,输入通道6,输出通道16,卷积核大小5
self.fc1 = nn.Linear(16 * 5 * 5, 120) # 全连接层1,输入特征数1655,输出120
self.fc2 = nn.Linear(120, 84) # 全连接层2,输入120,输出84
self.fc3 = nn.Linear(84, 10) # 全连接层3,输入84,输出10(对应10个类别)

def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))  # 卷积1 -> 激活 -> 池化x = self.pool(torch.relu(self.conv2(x)))  # 卷积2 -> 激活 -> 池化x = x.view(-1, 16 * 5 * 5)  # 展平,为全连接层做准备x = torch.relu(self.fc1(x))  # 全连接1 -> 激活x = torch.relu(self.fc2(x))  # 全连接2 -> 激活x = self.fc3(x)  # 全连接3,输出类别得分return x

net = Net()

定义损失函数和优化器

criterion = nn.CrossEntropyLoss() # 交叉熵损失函数,适用于分类问题
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 随机梯度下降优化器,学习率0.001,动量0.9

训练网络

for epoch in range(2): # 训练2个epoch
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 获取输入数据
inputs, labels = data
# 梯度清零
optimizer.zero_grad()
# 前向传播
outputs = net(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 打印训练信息
running_loss += loss.item()
if i % 2000 == 1999: # 每2000个mini - batch打印一次
print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0

print('Finished Training')

保存模型

PATH = './cifar_net.pth'
torch.save(net.state_dict(), PATH)

测试网络

correct = 0
total = 0
with torch.no_grad(): # 测试时不需要计算梯度
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1) # 获取预测的类别
total += labels.size(0)
correct += (predicted == labels).sum().item() # 统计正确预测的数量

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

http://www.hskmm.com/?act=detail&tid=32915

相关文章:

  • 2025全屋定制厂家推荐:聚焦异形空间+特色色系,森佰特木业领衔优质之选
  • springboot 上传图片到服务器之后,前段不能正确加载图片问题
  • springboot 设置文件上传大小
  • 【光照】UnityURP[屏幕空间环境光遮蔽SSAO]原理剖析实践
  • Ai元人文:讨论一种新的决策科学
  • 2025年流量计厂家权威推荐榜单:热式/模拟式/数字式/高压/高温/耐腐蚀/多气体/4-20mA/RS485/分体式/不锈钢高精度流量计公司精选
  • 深入解析:云原生时代的数据流高速公路:深入解剖Apache Pulsar的架构设计哲学
  • 251017
  • DeepResearch代码浅析
  • 2025年连铸机厂家权威推荐榜单:扇形段/大包回转台/钢包中间罐/结晶器总成/拉矫机/引锭杆/输送辊道/液压剪等核心部件专业供应商
  • 拉格朗日插值
  • 2025年10月中国专精特新申报服务机构推荐榜:五强实测
  • 2025年轧钢设备厂家权威推荐榜:冷轧机、热轧机源头生产厂家,技术实力与市场口碑深度解析
  • 正态总体中标准化单样本残差的分布推导
  • 10.16 CSP-S 模拟赛总结
  • 远程无钥匙进入(PKE)技术:便利与安全的完美融合
  • 203. 移除链表元素
  • 灵动岛iPhone状态栏获得高度不对 iOS iPhone14pro iPhone14pro max状态栏获得高度不对
  • string略解
  • 《程序员修炼之道》 阅读笔记二
  • 是时候告别向日葵、Todesk、TeamViewer了,快速搭建自托管服务器RustDesk
  • 史馆
  • firecrawl 私有部署(test)
  • $\text{Catalan}$ 数 卡特兰数
  • java作业3
  • 大模型 | VLM 初识及在自动驾驶场景中的应用
  • CF1977 Codeforces Round 948 (Div. 2) 游记(VP)
  • 别被波形“骗” 了!差分探头与无源探头测量不一致的 5 大关键因素
  • 2025 年展览会服务商最新推荐榜权威发布:22 年经验甄选十强品牌,助力企业参展高效决策
  • 2025年信息流代运营服务商权威推荐榜单:专业投放策略与效果优化服务口碑之选