网站后台发邮件珠海网站系统建设项目
2026/4/6 9:48:58 网站建设 项目流程
网站后台发邮件,珠海网站系统建设项目,三明网站制作,网络培训的心得体会一、MNIST 手写数字数据集的分类1.数据集加载与可视化# 加载MNIST训练集和测试集 train_datadatasets.MNIST(rootdata, # 数据保存路径trainTrue, # 加载训练集downloadTrue, # 如果本地没有则自动下载transformToTensor(),# 将图片转为PyTorc…一、MNIST 手写数字数据集的分类1.数据集加载与可视化# 加载MNIST训练集和测试集 train_datadatasets.MNIST( rootdata, # 数据保存路径 trainTrue, # 加载训练集 downloadTrue, # 如果本地没有则自动下载 transformToTensor(),# 将图片转为PyTorch的Tensor格式并归一化到[0,1] ) test_datadatasets.MNIST( rootdata, trainFalse, # 加载测试集 downloadTrue, transformToTensor(), ) # 可视化9张样本图片从第59000个样本开始 from matplotlib import pyplot as plt figureplt.figure() for i in range(9): img,labeltrain_data[i59000] # 获取第59000i个样本的图片和标签 figure.add_subplot(3,3,i1) # 创建3x3的子图布局 plt.title(label) # 显示图片对应的数字标签 plt.axis(off) # 关闭坐标轴 plt.imshow(img.squeeze(),cmapgray) # 显示图片squeeze()去掉维度为1的通道维度 aimg.squeeze() # 只是临时保存处理后的图片无实际作用 plt.show() # 展示图片ToTensor()将 PIL 图片转为形状为[C, H, W]通道、高度、宽度的 Tensor且像素值从[0,255]归一化到[0,1]img.squeeze()MNIST 图片是单通道维度为 1squeeze()会去掉这个维度从[1,28,28]变为[28,28]才能被 matplotlib 正确显示2. 数据加载器DataLoader创建# 创建数据加载器按批次加载数据 train_dataloaderDataLoader(train_data,batch_size64) # 训练集批次大小64 test_dataloaderDataLoader(test_data,batch_size64) # 测试集批次大小64DataLoaderPyTorch 的核心数据加载工具将数据集按batch_size分成多个批次支持多线程加载、打乱数据等3. 设备配置device cuda if torch.cuda.is_available() else mps if torch.backends.mps.is_available() else cpu print(fUsing {device} device)1.这是 PyTorch 跨平台的设备配置方式确保代码能在不同硬件上运行2.后续模型和数据都会被移到这个设备上利用 GPU 加速计算4. CNN 模型定义class CNN(nn.Module):#通过调用类的形式来使用神经网络神经网络的模型nn.module1个用法 def __init__(self):#python基础关于类self类自己本身 super(CNN,self).__init__()#继承的父类初始化 self.conv1nn.Sequential( nn.Conv2d(1,16,5,1,2), nn.ReLU(), nn.MaxPool2d(kernel_size2) ) self.conv2nn.Sequential( nn.Conv2d(16,32,5,1,2), nn.ReLU(), nn.Conv2d(32,32,5,1,2), nn.ReLU(), nn.MaxPool2d(kernel_size2), nn.Conv2d(32, 64, 5, 1, 2), nn.ReLU(), ) # self.conv3nn.Sequential( # nn.Conv2d(32, 64, 5, 1, 2), # nn.ReLU(), # ) self.outnn.Linear(64*7*7,10) def forward(self,x): x self.conv1(x) xself.conv2(x) # xself.conv3(x) xx.view(x.size(0),-1) outputself.out(x) return output modelCNN().to(device)#把刚刚创建的模型传入到Gpu print(model)1.nn.Sequential按顺序堆叠网络层简化代码2.nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)卷积层参数说明.padding2在图片边缘填充 2 个像素保证卷积后尺寸不变计算公式H_out (H_in 2*padding - kernel_size)/stride 14.x.view(x.size(0),-1)view是重塑张量形状-1表示自动计算该维度大小目的是将二维特征图转为一维向量输入全连接层5.model.to(device)将模型的所有参数移到指定设备5.训练函数def train(dataloader,model,loss_fn,optimizer): model.train() # 切换到训练模式启用Dropout、BatchNorm等训练特有的层 batch_size_num1 # 统计批次数量 for x,y in dataloader: # 遍历每个批次 x,y x.to(device),y.to(device) # 数据移到指定设备 pred model.forward(x) # 前向传播得到预测值可简写为model(x) loss loss_fn(pred,y) # 计算预测值和真实标签的损失 # 反向传播三部曲 optimizer.zero_grad() # 清空上一轮的梯度否则会累加 loss.backward() # 反向传播计算梯度 optimizer.step() # 根据梯度更新模型参数 loss_valueloss.item() # 提取损失值从Tensor转为普通数值 if batch_size_num %100 0: # 每100个批次打印一次损失 print(floss:{loss_value:7f} [number:{batch_size_num}]) batch_size_num 1model.train()启用训练模式比如 BatchNorm 会更新均值 / 方差Dropout 会随机丢弃神经元optimizer.zero_grad()PyTorch 的梯度会累加所以每次迭代前必须清空loss.backward()计算所有可训练参数的梯度optimizer.step()用优化器更新参数Adam 算法6.测试函数def test(dataloader,model,loss_fn): size len(dataloader.dataset) # 测试集总样本数10000 num_batcheslen(dataloader) # 测试集总批次 model.eval() # 切换到评估模式关闭Dropout、固定BatchNorm test_loss,correct 0,0 # 初始化总损失和正确数 with torch.no_grad(): # 禁用梯度计算测试时不需要节省内存和计算 for x,y in dataloader: x,y x.to(device),y.to(device) predmodel.forward(x) test_lossloss_fn(pred,y).item() # 累加批次损失 # 计算正确预测数pred.argmax(1)取每行最大值索引预测类别和真实标签比较 correct (pred.argmax(1) y).type(torch.float).sum().item() test_loss/num_batches # 计算平均损失 correct/size # 计算准确率 print(fTest result:\n Accuracy:{(100*correct)}%Avg loss: {test_loss})model.eval()切换到评估模式保证 Dropout/BatchNorm 的行为和训练一致torch.no_grad()上下文管理器禁用梯度计算大幅提升测试速度pred.argmax(1)在维度 1 上取最大值索引每个样本的预测类别7.测试结果# 定义损失函数交叉熵损失适合分类任务 loss_fnnn.CrossEntropyLoss() # 定义优化器Adam学习率0.01 optimizertorch.optim.Adam(model.parameters(),lr0.01) # 训练10个epoch完整遍历数据集10次 for t in range(10): print(fEpoch {t1}\n----------) train(train_dataloader,model,loss_fn,optimizer) print(Done!) # 训练完成后测试模型 test(test_dataloader,model,loss_fn)nn.CrossEntropyLoss()结合了log_softmax和nll_loss是分类任务的标准损失函数 torch.optim.AdamAdam 优化器是目前最常用的优化器之一自适应学习率

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询