网站域名怎么用平台网站建设合同
2026/6/16 17:16:48 网站建设 项目流程
网站域名怎么用,平台网站建设合同,网校网站模板,网络推广软文是一种很好的推广方式目标 理解MNIST手写数字数据集的结构和特点使用PyTorch构建一个简单的全连接神经网络掌握数据加载、模型训练、评估和保存的完整流程使用训练好的模型进行预测并可视化结果知识铺垫 2.1 MNIST数据集简介 MNIST是一个经典的手写数字识别数据集#xff0c;包含#xff1a; 训练…目标理解MNIST手写数字数据集的结构和特点使用PyTorch构建一个简单的全连接神经网络掌握数据加载、模型训练、评估和保存的完整流程使用训练好的模型进行预测并可视化结果知识铺垫2.1 MNIST数据集简介MNIST是一个经典的手写数字识别数据集包含训练集60,000张28×28像素的灰度图片测试集10,000张28×28像素的灰度图片标签每张图片对应0-9中的一个数字2.2 神经网络基本结构我们将构建一个全连接神经网络Fully Connected Neural Network输入层(784) → 隐藏层1(64) → 隐藏层2(64) → 隐藏层3(64) → 输出层(10)输入层28×28784个神经元将图片展平隐藏层3层每层64个神经元输出层10个神经元对应0-9这10个数字2.3 核心概念回顾激活函数ReLURectified Linear Unit增加非线性损失函数负对数似然损失NLLLoss优化器Adam自适应学习率优化算法代码实践环境说明Python 3.8PyTorch 2.0torchvision用于加载MNIST数据集matplotlib用于可视化安装命令pipinstalltorch torchvision matplotlib3.1 完整代码结构我们先看一下整个项目的结构然后分块详细讲解# 导入必要的库importtorchfromtorch.utils.dataimportDataLoaderfromtorchvisionimporttransformsfromtorchvision.datasetsimportMNISTimportmatplotlib.pyplotasplt逐行解释import torch导入PyTorch核心库from torch.utils.data import DataLoader数据加载器用于批量加载数据from torchvision import transforms数据预处理工具from torchvision.datasets import MNISTMNIST数据集import matplotlib.pyplot as plt绘图库用于可视化3.2 神经网络模型定义# 神经网络模型定义classNet(torch.nn.Module):def__init__(self):super().__init__()# 定义四个全连接层self.fc1torch.nn.Linear(28*28,64)# 输入层→隐藏层1self.fc2torch.nn.Linear(64,64)# 隐藏层1→隐藏层2self.fc3torch.nn.Linear(64,64)# 隐藏层2→隐藏层3self.fc4torch.nn.Linear(64,10)# 隐藏层3→输出层defforward(self,x):# 前向传播过程xtorch.nn.functional.relu(self.fc1(x))# 第一层 ReLU激活xtorch.nn.functional.relu(self.fc2(x))# 第二层 ReLU激活xtorch.nn.functional.relu(self.fc3(x))# 第三层 ReLU激活xtorch.nn.functional.log_softmax(self.fc4(x),dim1)# 输出层 log_softmaxreturnx原理拆解torch.nn.Module所有神经网络模型的基类必须继承这个类来定义自己的网络init()方法初始化网络层torch.nn.Linear(in_features, out_features)定义全连接层参数说明28×28784输入尺寸64隐藏层神经元数10输出类别数forward()方法定义前向传播过程torch.nn.functional.relu()ReLU激活函数torch.nn.functional.log_softmax()log_softmax函数用于多分类问题dim1在第一个维度每行的10个输出上计算softmax为什么使用log_softmax数值稳定性更好与NLLLoss负对数似然损失配合使用计算交叉熵损失更高效3.3 数据加载函数# 数据加载函数defget_data_loader(is_train):# 定义数据预处理将PIL图像转换为Tensorto_tensortransforms.Compose([transforms.ToTensor()])# 加载MNIST数据集data_setMNIST(,# 数据集保存路径空表示当前目录is_train,# True训练集False测试集transformto_tensor,# 应用预处理downloadTrue# 如果本地没有则下载)# 创建DataLoaderreturnDataLoader(data_set,# 数据集batch_size15,# 每批15个样本shuffleTrue# 打乱数据顺序)逐行解释transforms.Compose将多个预处理操作组合在一起transforms.ToTensor()将PIL图像或numpy数组转换为PyTorch Tensor并自动归一化到[0,1]MNIST类参数第一个参数数据保存路径is_train是否为训练集transform数据预处理管道downloadTrue自动下载数据集DataLoader参数batch_size15每批加载15张图片shuffleTrue打乱数据顺序避免模型学习到顺序信息⚠️注意训练集需要shuffle测试集通常不需要但这里统一设置为True3.4 评估函数# 评估函数计算模型在测试集上的准确率defevaluate(test_data,net):n_correct0# 正确预测的数量n_total0# 总样本数量withtorch.no_grad():# 关闭梯度计算节省内存for(x,y)intest_data:# 遍历测试集# 前向传播outputsnet.forward(x.view(-1,28*28))# 统计正确预测数fori,outputinenumerate(outputs):iftorch.argmax(output)y[i]:n_correct1n_total1returnn_correct/n_total# 返回准确率原理拆解torch.no_grad()上下文管理器关闭自动梯度计算评估阶段不需要计算梯度可以节省内存和计算资源x.view(-1, 28*28)改变张量形状-1表示自动计算该维度大小将[batch_size, 1, 28, 28]变为[batch_size, 784]torch.argmax(output)返回output中最大值的索引因为output有10个值最大值的索引就是预测的数字3.5 训练函数# 训练函数defmain():# 加载数据train_dataget_data_loader(is_trainTrue)test_dataget_data_loader(is_trainFalse)# 创建模型实例netNet()# 初始准确率随机权重print(初始准确率:,evaluate(test_data,net))# 定义优化器optimizertorch.optim.Adam(net.parameters(),lr0.001)# 训练3个epochforepochinrange(3):# 遍历训练集for(x,y)intrain_data:# 梯度清零net.zero_grad()# 前向传播outputnet.forward(x.view(-1,28*28))# 计算损失losstorch.nn.functional.nll_loss(output,y)# 反向传播loss.backward()# 更新权重optimizer.step()# 每个epoch结束后评估print(epoch,epoch,准确率:,evaluate(test_data,net))# 保存模型参数torch.save(net.state_dict(),MNIST_model_params.pt)print(模型已保存为 MNIST_model_params.pt)# 可视化前4个测试样本的预测结果for(n,(x,_))inenumerate(test_data):ifn3:break# 预测predicttorch.argmax(net.forward(x[0].view(-1,28*28)))# 绘制图像plt.figure(n)plt.imshow(x[0].view(28,28),cmapgray)plt.title(预测结果: str(int(predict)))plt.show()plt.close()训练过程详解优化器设置optimizertorch.optim.Adam(net.parameters(),lr0.001)Adam优化器自适应调整学习率lr0.001学习率控制权重更新的步长训练循环epoch整个训练集遍历一次batch每次处理一小批数据15个样本关键步骤net.zero_grad()梯度清零防止梯度累积loss.backward()反向传播计算梯度optimizer.step()更新权重损失函数losstorch.nn.functional.nll_loss(output,y)NLLLoss负对数似然损失与log_softmax输出配合使用3.6 预测函数# 预测函数加载已训练的模型并进行预测defpredict():# 创建模型实例netNet()# 加载训练好的权重net.load_state_dict(torch.load(MNIST_model_params.pt,weights_onlyTrue))# 加载测试数据test_dataget_data_loader(is_trainFalse)# 创建3×3的子图显示9个预测结果plt.figure(figsize(10,8))# 预测前9个测试样本for(n,(x,_))inenumerate(test_data):ifn8:break# 预测predicttorch.argmax(net.forward(x[0].view(-1,28*28)))# 在子图中显示plt.subplot(3,3,n1)plt.imshow(x[0].view(28,28),cmapgray)plt.title(预测: str(int(predict)))plt.axis(off)# 关闭坐标轴plt.tight_layout()plt.show()plt.close()# 运行训练注释掉避免重复运行# main()# 运行预测predict()运行结果常见问题Q1: 为什么准确率一开始很低A: 初始权重是随机的模型还没有学习到任何规律。随着训练进行准确率会逐渐提高。Q2: batch_size设置为多少合适A: 通常建议使用2的幂次如16、32、64。太小训练不稳定太大内存可能不够。这里使用15是为了演示。Q3: 如何选择学习率A: 0.001是常用初始值。如果训练不稳定损失震荡可以调小如果收敛太慢可以适当调大。Q4: 为什么需要net.zero_grad()A: PyTorch会累积梯度。如果不清零每次backward()的梯度会加到之前的梯度上导致错误更新。Q5: 如何保存整个模型不只是参数A: 使用torch.save(net, model.pth)加载时使用net torch.load(model.pth)总结练习本节核心知识点总结数据加载使用torchvision加载MNISTDataLoader批量处理模型定义继承nn.Module定义__init__和forward方法训练流程前向传播→计算损失→反向传播→更新权重评估保存计算准确率保存模型参数实操小练习修改网络结构尝试增加或减少隐藏层的数量观察对准确率的影响# 尝试修改为self.fc1torch.nn.Linear(28*28,128)self.fc2torch.nn.Linear(128,64)self.fc3torch.nn.Linear(64,10)调整超参数修改学习率和batch_size观察训练效果# 尝试optimizertorch.optim.Adam(net.parameters(),lr0.0005)# 或returnDataLoader(data_set,batch_size32,shuffleTrue)扩展功能添加验证集在每个epoch后同时计算训练集和验证集的准确率

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

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

立即咨询