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

day 41

@浙大疏锦行

importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltimportnumpyasnp# 设置中文字体支持plt.rcParams["font.family"]=["SimHei"]plt.rcParams['axes.unicode_minus']=False# 解决负号显示问题# 1. 数据预处理transform=transforms.Compose([transforms.ToTensor(),# 转换为张量并归一化到[0,1]transforms.Normalize((0.1307,),(0.3081,))# MNIST数据集的均值和标准差])# 2. 加载MNIST数据集train_dataset=datasets.MNIST(root='./data',train=True,download=True,transform=transform)test_dataset=datasets.MNIST(root='./data',train=False,transform=transform)# 3. 创建数据加载器batch_size=64# 每批处理64个样本train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)# 4. 定义模型、损失函数和优化器classMLP(nn.Module):def__init__(self):super(MLP,self).__init__()self.flatten=nn.Flatten()# 将28x28的图像展平为784维向量self.layer1=nn.Linear(784,128)# 第一层:784个输入,128个神经元self.relu=nn.ReLU()# 激活函数self.layer2=nn.Linear(128,10)# 第二层:128个输入,10个输出(对应10个数字类别)defforward(self,x):x=self.flatten(x)# 展平图像x=self.layer1(x)# 第一层线性变换x=self.relu(x)# 应用ReLU激活函数x=self.layer2(x)# 第二层线性变换,输出logitsreturnx# 检查GPU是否可用device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")# 初始化模型model=MLP()model=model.to(device)# 将模型移至GPU(如果可用)criterion=nn.CrossEntropyLoss()# 交叉熵损失函数,适用于多分类问题optimizer=optim.Adam(model.parameters(),lr=0.001)# Adam优化器# 5. 训练模型(记录每个 iteration 的损失)deftrain(model,train_loader,test_loader,criterion,optimizer,device,epochs):model.train()# 设置为训练模式# 新增:记录每个 iteration 的损失all_iter_losses=[]# 存储所有 batch 的损失iter_indices=[]# 存储 iteration 序号(从1开始)forepochinrange(epochs):running_loss=0.0correct=0total=0forbatch_idx,(data,target)inenumerate(train_loader):data,target=data.to(device),target.to(device)# 移至GPU(如果可用)optimizer.zero_grad()# 梯度清零output=model(data)# 前向传播loss=criterion(output,target)# 计算损失loss.backward()# 反向传播optimizer.step()# 更新参数# 记录当前 iteration 的损失(注意:这里直接使用单 batch 损失,而非累加平均)iter_loss=loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch*len(train_loader)+batch_idx+1)# iteration 序号从1开始# 统计准确率和损失(原逻辑保留,用于 epoch 级统计)running_loss+=iter_loss _,predicted=output.max(1)total+=target.size(0)correct+=predicted.eq(target).sum().item()# 每100个批次打印一次训练信息(可选:同时打印单 batch 损失)if(batch_idx+1)%100==0:print(f'Epoch:{epoch+1}/{epochs}| Batch:{batch_idx+1}/{len(train_loader)}'f'| 单Batch损失:{iter_loss:.4f}| 累计平均损失:{running_loss/(batch_idx+1):.4f}')# 原 epoch 级逻辑(测试、打印 epoch 结果)不变epoch_train_loss=running_loss/len(train_loader)epoch_train_acc=100.*correct/total epoch_test_loss,epoch_test_acc=test(model,test_loader,criterion,device)print(f'Epoch{epoch+1}/{epochs}完成 | 训练准确率:{epoch_train_acc:.2f}% | 测试准确率:{epoch_test_acc:.2f}%')# 绘制所有 iteration 的损失曲线plot_iter_losses(all_iter_losses,iter_indices)# 保留原 epoch 级曲线(可选)# plot_metrics(train_losses, test_losses, train_accuracies, test_accuracies, epochs)returnepoch_test_acc# 返回最终测试准确率# 6. 测试模型deftest(model,test_loader,criterion,device):model.eval()# 设置为评估模式test_loss=0correct=0total=0withtorch.no_grad():# 不计算梯度,节省内存和计算资源fordata,targetintest_loader:data,target=data.to(device),target.to(device)output=model(data)test_loss+=criterion(output,target).item()_,predicted=output.max(1)total+=target.size(0)correct+=predicted.eq(target).sum().item()avg_loss=test_loss/len(test_loader)accuracy=100.*correct/totalreturnavg_loss,accuracy# 返回损失和准确率# 7.绘制每个 iteration 的损失曲线defplot_iter_losses(losses,indices):plt.figure(figsize=(10,4))plt.plot(indices,losses,'b-',alpha=0.7,label='Iteration Loss')plt.xlabel('Iteration(Batch序号)')plt.ylabel('损失值')plt.title('每个 Iteration 的训练损失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 8. 执行训练和测试(设置 epochs=2 验证效果)epochs=2print("开始训练模型...")final_accuracy=train(model,train_loader,test_loader,criterion,optimizer,device,epochs)print(f"训练完成!最终测试准确率:{final_accuracy:.2f}%")
importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltimportnumpyasnp# 设置中文字体支持plt.rcParams["font.family"]=["SimHei"]plt.rcParams['axes.unicode_minus']=False# 解决负号显示问题# 1. 数据预处理transform=transforms.Compose([transforms.ToTensor(),# 转换为张量transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))# 标准化处理])# 2. 加载CIFAR-10数据集train_dataset=datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)test_dataset=datasets.CIFAR10(root='./data',train=False,transform=transform)# 3. 创建数据加载器batch_size=64train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)# 4. 定义MLP模型(适应CIFAR-10的输入尺寸)classMLP(nn.Module):def__init__(self):super(MLP,self).__init__()self.flatten=nn.Flatten()# 将3x32x32的图像展平为3072维向量self.layer1=nn.Linear(3072,512)# 第一层:3072个输入,512个神经元self.relu1=nn.ReLU()self.dropout1=nn.Dropout(0.2)# 添加Dropout防止过拟合self.layer2=nn.Linear(512,256)# 第二层:512个输入,256个神经元self.relu2=nn.ReLU()self.dropout2=nn.Dropout(0.2)self.layer3=nn.Linear(256,10)# 输出层:10个类别defforward(self,x):# 第一步:将输入图像展平为一维向量x=self.flatten(x)# 输入尺寸: [batch_size, 3, 32, 32] → [batch_size, 3072]# 第一层全连接 + 激活 + Dropoutx=self.layer1(x)# 线性变换: [batch_size, 3072] → [batch_size, 512]x=self.relu1(x)# 应用ReLU激活函数x=self.dropout1(x)# 训练时随机丢弃部分神经元输出# 第二层全连接 + 激活 + Dropoutx=self.layer2(x)# 线性变换: [batch_size, 512] → [batch_size, 256]x=self.relu2(x)# 应用ReLU激活函数x=self.dropout2(x)# 训练时随机丢弃部分神经元输出# 第三层(输出层)全连接x=self.layer3(x)# 线性变换: [batch_size, 256] → [batch_size, 10]returnx# 返回未经过Softmax的logits# 检查GPU是否可用device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")# 初始化模型model=MLP()model=model.to(device)# 将模型移至GPU(如果可用)criterion=nn.CrossEntropyLoss()# 交叉熵损失函数optimizer=optim.Adam(model.parameters(),lr=0.001)# Adam优化器# 5. 训练模型(记录每个 iteration 的损失)deftrain(model,train_loader,test_loader,criterion,optimizer,device,epochs):model.train()# 设置为训练模式# 记录每个 iteration 的损失all_iter_losses=[]# 存储所有 batch 的损失iter_indices=[]# 存储 iteration 序号forepochinrange(epochs):running_loss=0.0correct=0total=0forbatch_idx,(data,target)inenumerate(train_loader):data,target=data.to(device),target.to(device)# 移至GPUoptimizer.zero_grad()# 梯度清零output=model(data)# 前向传播loss=criterion(output,target)# 计算损失loss.backward()# 反向传播optimizer.step()# 更新参数# 记录当前 iteration 的损失iter_loss=loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch*len(train_loader)+batch_idx+1)# 统计准确率和损失running_loss+=iter_loss _,predicted=output.max(1)total+=target.size(0)correct+=predicted.eq(target).sum().item()# 每100个批次打印一次训练信息if(batch_idx+1)%100==0:print(f'Epoch:{epoch+1}/{epochs}| Batch:{batch_idx+1}/{len(train_loader)}'f'| 单Batch损失:{iter_loss:.4f}| 累计平均损失:{running_loss/(batch_idx+1):.4f}')# 计算当前epoch的平均训练损失和准确率epoch_train_loss=running_loss/len(train_loader)epoch_train_acc=100.*correct/total# 测试阶段model.eval()# 设置为评估模式test_loss=0correct_test=0total_test=0withtorch.no_grad():fordata,targetintest_loader:data,target=data.to(device),target.to(device)output=model(data)test_loss+=criterion(output,target).item()_,predicted=output.max(1)total_test+=target.size(0)correct_test+=predicted.eq(target).sum().item()epoch_test_loss=test_loss/len(test_loader)epoch_test_acc=100.*correct_test/total_testprint(f'Epoch{epoch+1}/{epochs}完成 | 训练准确率:{epoch_train_acc:.2f}% | 测试准确率:{epoch_test_acc:.2f}%')# 绘制所有 iteration 的损失曲线plot_iter_losses(all_iter_losses,iter_indices)returnepoch_test_acc# 返回最终测试准确率# 6. 绘制每个 iteration 的损失曲线defplot_iter_losses(losses,indices):plt.figure(figsize=(10,4))plt.plot(indices,losses,'b-',alpha=0.7,label='Iteration Loss')plt.xlabel('Iteration(Batch序号)')plt.ylabel('损失值')plt.title('每个 Iteration 的训练损失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 7. 执行训练和测试epochs=20# 增加训练轮次以获得更好效果print("开始训练模型...")final_accuracy=train(model,train_loader,test_loader,criterion,optimizer,device,epochs)print(f"训练完成!最终测试准确率:{final_accuracy:.2f}%")# # 保存模型# torch.save(model.state_dict(), 'cifar10_mlp_model.pth')# # print("模型已保存为: cifar10_mlp_model.pth")
http://www.jsqmd.com/news/469094/

相关文章:

  • 电动车电源改造指南:用AH7690实现60V电池组降压5V供电(效率92%实测)
  • 立创EDA实战:从原理图到3D打印,打造触摸感应温馨小夜灯
  • Ubuntu下高效配置pip镜像源的两种方法
  • .NET 9云原生升级路径图(含迁移成本测算表+兼容性矩阵):企业级项目零停机迁移的最后窗口期
  • CHORD-X效果实测:生成百页深度行业研究报告的质量与效率评估
  • 翻译大法降AI教程:3步操作把AI率降到15%以下 - 还在做实验的师兄
  • ESP32-C61 AT命令全栈实战:Wi-Fi透传、mDNS、BLE GATT与鲁棒性设计
  • 多语言翻译模型实战:HY-MT1.8B+Chainlit搭建翻译Web界面
  • 视频修复技术全解析:从原理到实战的媒体文件恢复方案
  • AI赋能:让快马智能生成与你项目技术栈精准匹配的安装教程
  • Local Moondream2一键部署教程:VSCode开发环境配置
  • 2026年SCI降AI率用什么好?理工科同学亲测这3款 - 还在做实验的师兄
  • SystemVerilog中local::的5个实际应用场景解析(附代码示例)
  • maven介绍_1
  • Qwen3-TTS-12Hz-1.7B-CustomVoice在播客制作中的应用:自动化内容生成方案
  • 1. 基于ESP32-S3的1.8寸彩色触摸屏(ST7735S+XPT2046)驱动移植与画板应用实战
  • 效率提升:用快马生成mac一键安装配置OpenClaw的自动化脚本
  • 避坑指南:海康威视Linux SDK在Ubuntu 22.04的5个常见编译错误及解决方法
  • 实时手机检测-通用模型常见问题解决:部署与使用全攻略
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4代码助手实战:AI编程辅助工具开发
  • CHORD-X开发利器:IntelliJ IDEA高效开发环境配置与插件推荐
  • DeOldify在网络安全领域的应用:对监控录像黑白片段进行色彩还原辅助侦查
  • 2026年别再用AI直接交论文了!这3款降AI率工具帮你过检测 - 还在做实验的师兄
  • 互联网公开数据合规利用:为万象熔炉·丹青幻境构建领域知识库
  • Python3.10新特性实战:用Miniconda镜像快速体验match-case语法
  • 抖音内容高效下载全攻略:从单视频到批量采集的完整解决方案
  • AI开发者必看:YOLOv8极速CPU版部署避坑指南
  • 小白友好:星图平台快速搭建Clawdbot,私有化Qwen3-VL:30B接入飞书全流程
  • 论文修改回复信 LaTeX 模板分享(已录用CCF A类会议ICDE 2026)
  • 2026年降AI后字数暴增暴减怎么办?这份避坑指南帮你搞定 - 还在做实验的师兄