手机网站建设服务律师的网站模板
2026/5/18 7:45:13 网站建设 项目流程
手机网站建设服务,律师的网站模板,高水平的大连网站建设,网站建设图片教程视频教程Day 79#xff1a;【99天精通Python】深度学习入门 (PyTorch) 下篇 - 搭建神经网络 (nn.Module) 前言 欢迎来到第79天#xff01; 在昨天的课程中#xff0c;我们手动管理权重 w 和 b#xff0c;手动计算 Loss#xff0c;手动更新梯度。这对于理解原理很有帮助#xff0c…Day 79【99天精通Python】深度学习入门 (PyTorch) 下篇 - 搭建神经网络 (nn.Module)前言欢迎来到第79天在昨天的课程中我们手动管理权重w和b手动计算 Loss手动更新梯度。这对于理解原理很有帮助但如果要搭建一个几百层的神经网络这样写非得累死。PyTorch 提供了强大的torch.nn模块它封装了各种神经网络层全连接层、卷积层、循环层和损失函数。我们只需要像搭积木一样把它们拼在一起就能构建出复杂的深度学习模型。本节内容nn.Module神经网络的基类常用层nn.Linear,nn.ReLU损失函数nn.MSELoss,nn.CrossEntropyLoss优化器torch.optim(SGD, Adam)实战练习手写数字识别 (MNIST)一、搭建神经网络搭积木在 PyTorch 中所有的神经网络都必须继承nn.Module类。1.1 定义模型结构假设我们要解决昨天的线性回归问题y wx b这在神经网络中就是一个全连接层 (Linear Layer)。importtorchimporttorch.nnasnnclassLinearRegressionModel(nn.Module):def__init__(self):super().__init__()# 定义层输入特征1个输出特征1个# y w * x bself.linearnn.Linear(in_features1,out_features1)defforward(self,x):# 定义前向传播路径outself.linear(x)returnout modelLinearRegressionModel()print(model)二、损失函数与优化器2.1 损失函数 (Loss Function)不需要手写(y-y_pred)**2了直接调用回归问题nn.MSELoss()(均方误差)分类问题nn.CrossEntropyLoss()(交叉熵)2.2 优化器 (Optimizer)不需要手写w - lr * w.grad了优化器帮我们管理所有参数的更新。SGD (随机梯度下降)最基础稳但慢。Adam自适应学习率快且收敛好推荐。importtorch.optimasoptim criterionnn.MSELoss()optimizeroptim.SGD(model.parameters(),lr0.01)三、完整的训练循环 (重构昨日代码)看看代码变得多么简洁x_traintorch.rand(100,1)*10y_train2*x_train5torch.randn(100,1)*0.5# 1. 实例化模型、损失、优化器modelLinearRegressionModel()criterionnn.MSELoss()optimizeroptim.SGD(model.parameters(),lr0.01)# 2. 训练循环forepochinrange(1000):# 前向y_predmodel(x_train)losscriterion(y_pred,y_train)# 反向 (标准三步走)optimizer.zero_grad()# 清零loss.backward()# 求导optimizer.step()# 更新ifepoch%1000:print(fEpoch{epoch}, Loss:{loss.item():.4f})# 查看学习到的参数# model.parameters() 是一个生成器forname,paraminmodel.named_parameters():print(name,param.item())四、实战手写数字识别 (MNIST)这是深度学习界的Hello World。我们要训练一个网络识别 0-9 的手写数字图片。4.1 加载数据 (Torchvision)PyTorch 提供了torchvision库内置了常用数据集。importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoader# 数据预处理转为 Tensor并归一化transformtransforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))# MNIST的均值和标准差])# 下载数据集train_datasetdatasets.MNIST(./data,trainTrue,downloadTrue,transformtransform)test_datasetdatasets.MNIST(./data,trainFalse,transformtransform)# 数据加载器 (自动分批次 Batch)train_loaderDataLoader(train_dataset,batch_size64,shuffleTrue)test_loaderDataLoader(test_dataset,batch_size1000,shuffleFalse)4.2 定义网络 (多层感知机 MLP)图片是 28x28 像素的我们要把它拉平成 784 个特征然后通过几层全连接层最后输出 10 个分类的概率。classMLP(nn.Module):def__init__(self):super().__init__()# 定义层self.fc1nn.Linear(784,512)self.fc2nn.Linear(512,256)self.fc3nn.Linear(256,10)# 10分类self.relunn.ReLU()# 激活函数defforward(self,x):# x.shape: [64, 1, 28, 28] - 展平 - [64, 784]xx.view(-1,784)xself.relu(self.fc1(x))xself.relu(self.fc2(x))xself.fc3(x)# 最后一层不需要激活(CrossEntropyLoss会处理Softmax)returnx modelMLP()4.3 训练与测试devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)model.to(device)optimizeroptim.Adam(model.parameters(),lr0.001)criterionnn.CrossEntropyLoss()deftrain(epoch):model.train()# 切换到训练模式forbatch_idx,(data,target)inenumerate(train_loader):data,targetdata.to(device),target.to(device)optimizer.zero_grad()outputmodel(data)losscriterion(output,target)loss.backward()optimizer.step()ifbatch_idx%1000:print(fEpoch{epoch}[{batch_idx*len(data)}/{len(train_loader.dataset)}] Loss:{loss.item():.6f})deftest():model.eval()# 切换到评估模式test_loss0correct0withtorch.no_grad():fordata,targetintest_loader:data,targetdata.to(device),target.to(device)outputmodel(data)test_losscriterion(output,target).item()# 获取预测结果 (最大概率的索引)predoutput.argmax(dim1,keepdimTrue)correctpred.eq(target.view_as(pred)).sum().item()print(f\nTest set: Accuracy:{correct}/{len(test_loader.dataset)}({100.*correct/len(test_loader.dataset):.2f}%)\n)# 运行 3 个 Epochforepochinrange(1,4):train(epoch)test()运行只需几分钟准确率通常能达到 98% 以上五、常见问题Q1model.train()和model.eval()有什么用有些层如 Dropout, BatchNorm在训练和测试时的行为是不一样的。训练时Dropout 会随机丢弃神经元。测试时Dropout 不工作利用所有神经元。所以必须手动切换模式。Q2nn.ReLU是什么激活函数。如果没有它多少层网络叠加最后都等价于一层线性变换线性代数原理。激活函数引入了非线性让神经网络能拟合任意复杂的曲线。Q3view(-1, 784)是什么相当于 NumPy 的reshape。-1表示自动推断 Batch Size。六、小结PyTorch 神经网络构建模型 nn.Module数据加载 DataLoader训练管道init: 定义层forward: 定义流向transforms (预处理)batch_size (分批)zero_grad (清零)backward (求导)step (更新)关键要点nn.Module是所有模型的父类。Optimizer帮我们自动更新权重。DataLoader帮我们自动分批处理数据。三步走zero_grad-backward-step背下来七、课后作业保存模型查阅torch.save和torch.load将训练好的 MNIST 模型保存到硬盘并写一个新的脚本加载它进行预测。卷积神经网络 (CNN)将 MLP 改为 CNN使用nn.Conv2d和nn.MaxPool2d。CNN 提取图片特征的能力更强准确率应该能达到 99%。CIFAR-10MNIST 是黑白的尝试挑战 CIFAR-10 数据集彩色图片分类飞机、汽车、鸟等。下节预告Day 80项目篇 - 微信小程序后端开发 (上)- 深度学习有点烧脑我们换个口味。明天开始我们将开发一个微信小程序的后端 API打通手机与服务器的连接。系列导航上一篇Day 78 - 深度学习PyTorch上下一篇Day 80 - 小程序后端开发上待更新

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

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

立即咨询