news 2026/6/10 13:16:27

DAY41 简单CNN

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY41 简单CNN

@浙大疏锦行

importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltimportnumpyasnp plt.rcParams["font.family"]=["SimHei"]plt.rcParams['axes.unicode_minus']=False# 解决负号显示问题device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")print(f"使用设备:{device}")train_transform=transforms.Compose([transforms.RandomCrop(32,padding=4),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2,contrast=0.2,saturation=0.2,hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),])test_transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914,0.4822,0.4465),(0.2023,0.1994,0.2010))])train_dataset=datasets.CIFAR10(root='./data',train=True,download=True,transform=train_transform)test_dataset=datasets.CIFAR10(root='./data',train=False,transform=test_transform)batch_size=64train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)

由于本人的cuda不可用,因此使用cpu进行计算

classCNN(nn.Module):def__init__(self):super(CNN,self).__init__()self.conv1=nn.Conv2d(in_channels=3,out_channels=32,kernel_size=3,padding=1)self.bn1=nn.BatchNorm2d(num_features=32)self.relu1=nn.ReLU()self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)self.conv2=nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,padding=1)self.bn2=nn.BatchNorm2d(num_features=64)self.relu2=nn.ReLU()self.pool2=nn.MaxPool2d(kernel_size=2)self.conv3=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1)self.bn3=nn.BatchNorm2d(num_features=128)self.relu3=nn.ReLU()self.pool3=nn.MaxPool2d(kernel_size=2)self.fc1=nn.Linear(in_features=128*4*4,out_features=512)self.dropout=nn.Dropout(p=0.5)self.fc2=nn.Linear(in_features=512,out_features=10)defforward(self,x):x=self.conv1(x)x=self.bn1(x)x=self.relu1(x)x=self.pool1(x)x=self.conv2(x)x=self.bn2(x)x=self.relu(x)x=self.pool3(x)x=x.view(-1,128*4*4)x=self.fc1(x)x=self.relu3(x)x=self.dropout(x)x=self.fc2(x)returnx model=CNN()model=model.to(device)
criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.001)scheduler=optim.lr_scheduler.ReduceLROnPlateau(optimizer,mode='min',patience=3,factor=0.5)
deftrain(model,train_loader,test_loader,criterion,optimizer,scheduler,device,epochs):model.train()all_iter_losses=[]iter_indices=[]train_acc_history=[]test_acc_history=[]train_loss_history=[]test_loss_history=[]forepochinrange(epochs):running_loss=0.0correct=0total=0forbatch_idx,(data,target)inenumerate(train_loader):data,target=data.to(device),target.to(device)optimizer.zero_grad()output=model(data)loss=criterion(output,target)loss.backward()optimizer.step()iter_loss=loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch*len(train_loader))running_loss+=iter_loss _,predicted=output.max(1)total+=target.size(0)correct+=predicted.eq(target).sum().item()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_train_loss=running_loss/len(train_loader)epoch_train_acc=100.*correct/total train_acc_history.append(epoch_train_acc)train_loss_history.append(epoch_train_loss)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_test test_acc_history.append(epoch_test_acc)test_loss_history.append(epoch_test_loss)scheduler.step(epoch_test_loss)print(f'Epoch{epoch+1}/{epochs}完成 | 训练准确率:{epoch_train_acc:.2f}% | 测试准确率:{epoch_test_acc:.2f}%')plot_iter_losses(all_iter_losses,iter_indices)plot_epoch_metrics(train_acc_history,test_acc_history,train_loss_history,test_loss_history)returnepoch_test_accdefplot_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()defplot_epoch_metrics(train_acc,test_acc,train_loss,test_loss):epochs=range(1,len(train_acc)+1)plt.figure(figsize=(12,4))plt.subplot(1,2,1)plt.plot(epochs,train_acc,'b-',label='训练准确率')plt.plot(epochs,test_acc,'r-',label='测试准确率')plt.xlabel('Epoch')plt.ylabel('准确率 (%)')plt.title('训练和测试准确率')plt.legend()plt.grid(True)plt.subplot(1,2,2)plt.plot(epochs,train_loss,'b-',label='训练损失')plt.plot(epochs,test_loss,'r-',label='测试损失')plt.xlabel('Epoch')plt.ylabel('损失值')plt.title('训练和测试损失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()epochs=20print("开始使用CNN训练模型...")final_accuracy=train(model,train_loader,test_loader,criterion,optimizer,scheduler,device,epochs)print(f"训练完成!最终测试准确率:{final_accuracy:.2f}%")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 9:31:19

【工程设计问题】基于PSOGSA、CPSOGSA、GSA、PSO、BBO、DE、ACO、SCA、GWO、CGSA(CHGSA) 10 种智能优化算法求解压力容器设计问题附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

作者头像 李华
网站建设 2026/6/10 10:28:42

Infinigen程序化世界生成:5步打造无限逼真的虚拟环境

Infinigen程序化世界生成:5步打造无限逼真的虚拟环境 【免费下载链接】infinigen Infinite Photorealistic Worlds using Procedural Generation 项目地址: https://gitcode.com/gh_mirrors/in/infinigen 想要快速创建照片级逼真的虚拟世界却苦于手动建模的繁…

作者头像 李华
网站建设 2026/6/5 9:22:45

Java架构从单体到微服务历程

一、前言:架构演进的核心驱动力 Java架构从单体走向微服务,并非技术潮流的盲目跟随,而是企业业务发展到不同阶段的必然选择。核心驱动力主要包括: 业务复杂度提升:从简单的CRUD应用到多模块、多业务线的复杂系统&…

作者头像 李华
网站建设 2026/6/3 9:50:46

LWLP5000差压传感器原理图设计,已量产(压力传感器)

目录 1、电源稳压电路:给传感器 “喂” 足干净的电 2、I2C 电平转换:解决 “电平不兼容” 的痛点 3、传感器接口:把 “高精度” 落到实处 4、调试里的小细节 在智能通风系统、洁净室环境监测这类场景里,差压数据的采集精度直接决定了系统的控制效果 —— 比如洁净室的压…

作者头像 李华
网站建设 2026/6/7 5:37:01

Zoplicate插件:彻底告别Zotero文献库中的重复条目困扰

Zoplicate插件:彻底告别Zotero文献库中的重复条目困扰 【免费下载链接】zoplicate A plugin that does one thing only: Detect and manage duplicate items in Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zoplicate 你是不是也曾经遇到过这样的情…

作者头像 李华