2026/4/17 16:03:55
网站建设
项目流程
清新网站设计,公司宣传册模板图片,做网站和游戏是如何赚钱,wordpress 4 导航#x1f4cb; 前言
各位坚持打卡的伙伴们#xff0c;大家好#xff01;今天是学习之旅的第 33 天#xff0c;我们将在这一天完成一次重要的“座驾升级”。
如果说之前我们使用的 scikit-learn 是一辆自动挡汽车——三行代码model.fit(), model.predict()就能轻松上路 前言各位坚持打卡的伙伴们大家好今天是学习之旅的第 33 天我们将在这一天完成一次重要的“座驾升级”。如果说之前我们使用的scikit-learn是一辆自动挡汽车——三行代码model.fit(),model.predict()就能轻松上路那么从今天开始我们就要学习驾驶一辆手动挡赛车——PyTorch。你需要亲手控制离合数据、挂挡模型、踩油门训练过程更复杂但你能榨干发动机的每一分性能实现更高阶的驾驶技巧。准备好了吗让我们从安装环境开始正式进入深度学习的匠心世界一、核心知识点总结1. 环境准备为“赛车”修建专用赛道独立环境深度学习项目依赖复杂创建一个全新的 Conda 环境 (conda create -n DL python3.8) 是最佳实践。这就像为你的赛车修建一条专用赛道避免与其他车辆项目互相干扰。CPU vs. GPUCPU (博士)核心少但能力强擅长复杂的串行任务。GPU (成百上千的小学生)核心多但能力单一擅长简单的并行计算。深度学习的矩阵运算正是这种“简单重复”的工作所以 GPU 是首选。CUDANVIDIA 显卡的“官方加速驱动”。安装 PyTorch 时需要选择与你电脑 CUDA 版本兼容的 GPU 版本才能发挥显卡的威力。使用nvidia-smi命令可以查看你显卡支持的最高 CUDA 版本。2. PyTorch 的“三位一体”使用 PyTorch 构建模型主要围绕三个核心概念(1) 数据torch.Tensor(张量)Tensor是 PyTorch 世界的“血液”。它类似于 NumPy 的ndarray但有一个关键区别Tensor可以在 GPU 上进行计算。所有输入到模型的数据、模型内部的参数最终都是以Tensor的形式存在的。(2) 模型nn.Module(骨架)所有 PyTorch 模型都必须继承nn.Module。这就像一个模型的“骨架”我们只需要做两件事来填充它__init__()(积木采购)在这里定义模型需要的所有“层”积木比如线性层nn.Linear、激活函数nn.ReLU等。forward(self, x)(流水线组装)在这里定义数据x如何依次流过__init__中定义的各个层最终得到输出。(3) 训练The Five-Step Loop (训练心法)这是 PyTorch 的精髓一个标准的训练循环包含雷打不动的五个步骤前向传播outputs model(X_train)- 将数据喂给模型得到预测结果。计算损失loss criterion(outputs, y_train)- 比较预测结果和真实标签计算差距。梯度清零optimizer.zero_grad()- 清除上一轮的梯度信息准备新一轮计算。反向传播loss.backward()- 根据损失计算模型中每个参数应该调整的方向梯度。参数更新optimizer.step()- 根据计算出的梯度更新模型的所有参数。这个循环就是模型“学习”的过程。二、实战作业用 PyTorch 构建鸢尾花分类器我们将使用经典的鸢尾花数据集从零开始搭建、训练并评估一个简单的神经网络。1. 我的代码 (CPU 版本)# -*- coding: utf-8 -*-importtorchimporttorch.nnasnnimporttorch.optimasoptimfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScaler# 使用 StandardScaler 效果通常更好importmatplotlib.pyplotasplt# --- 1. 环境检查 ---print(fPyTorch Version:{torch.__version__})use_cudatorch.cuda.is_available()devicetorch.device(cuda:0ifuse_cudaelsecpu)print(f当前使用的设备:{device})ifuse_cuda:print(fCUDA 设备名称:{torch.cuda.get_device_name(0)})# --- 2. 数据准备 ---# 加载数据irisload_iris()X,yiris.data,iris.target# 划分数据集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42,stratifyy)# 数据标准化scalerStandardScaler()X_trainscaler.fit_transform(X_train)X_testscaler.transform(X_test)# 转换为 PyTorch TensorsX_train_tensortorch.FloatTensor(X_train).to(device)y_train_tensortorch.LongTensor(y_train).to(device)X_test_tensortorch.FloatTensor(X_test).to(device)y_test_tensortorch.LongTensor(y_test).to(device)# --- 3. 模型架构定义 ---classMLP(nn.Module):def__init__(self,input_size,hidden_size,num_classes):super(MLP,self).__init__()self.fc1nn.Linear(input_size,hidden_size)# 输入层 - 隐藏层self.relunn.ReLU()# 激活函数self.fc2nn.Linear(hidden_size,num_classes)# 隐藏层 - 输出层defforward(self,x):outself.fc1(x)outself.relu(out)outself.fc2(out)returnout# 实例化模型input_dim4hidden_dim10output_dim3modelMLP(input_dim,hidden_dim,output_dim).to(device)# 将模型移动到指定设备print(模型结构:)print(model)# --- 4. 定义损失函数和优化器 ---criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.01)# --- 5. 训练模型 ---num_epochs500train_losses[]test_accuracies[]forepochinrange(num_epochs):model.train()# 设置为训练模式# 前向传播outputsmodel(X_train_tensor)# 计算损失losscriterion(outputs,y_train_tensor)# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()train_losses.append(loss.item())# --- 在每个 epoch 后进行评估 ---model.eval()# 设置为评估模式withtorch.no_grad():# 在评估阶段不计算梯度test_outputsmodel(X_test_tensor)_,predictedtorch.max(test_outputs.data,1)correct(predictedy_test_tensor).sum().item()accuracy100*correct/len(y_test)test_accuracies.append(accuracy)if(epoch1)%500:print(fEpoch [{epoch1}/{num_epochs}], Loss:{loss.item():.4f}, Test Accuracy:{accuracy:.2f}%)# --- 6. 结果可视化 ---plt.figure(figsize(12,5))# 绘制损失曲线plt.subplot(1,2,1)plt.plot(train_losses)plt.title(Training Loss)plt.xlabel(Epoch)plt.ylabel(Loss)# 绘制准确率曲线plt.subplot(1,2,2)plt.plot(test_accuracies)plt.title(Test Accuracy)plt.xlabel(Epoch)plt.ylabel(Accuracy (%))plt.tight_layout()plt.show()# --- 7. 最终模型评估 ---model.eval()withtorch.no_grad():final_outputsmodel(X_test_tensor)_,final_predictedtorch.max(final_outputs.data,1)final_correct(final_predictedy_test_tensor).sum().item()final_accuracy100*final_correct/len(y_test)print(f\n最终在测试集上的准确率:{final_accuracy:.2f}%)三、学习心得拥抱“过程”的乐趣从sklearn到PyTorch最直观的感受是代码量变多了但自由度也变得无限大。这让我深刻体会到没有什么是理所当然的sklearn把数据处理、模型训练、评估都封装好了而PyTorch强迫我们去思考每一步的细节数据为什么要归一化为什么要转成 Tensor训练循环的每一步到底在干什么过程即是掌控虽然写了更多代码但我对模型内部发生的事情有了前所未有的掌控感。我可以随时打印出中间层的输出可以自定义损失函数可以精细地调整学习率。这种“一切尽在掌握”的感觉非常棒。思维的转变写PyTorch代码更像是在搭建一个动态的系统而不是调用一个静态的函数。这种从“使用者”到“创造者”的思维转变是深度学习之旅中最宝贵的收获。驾驶“手动挡”虽然初期会手忙脚乱但当你熟练之后人车合一的快感是“自动挡”无法给予的。PyTorch 正是如此。最后感谢 浙大疏锦行 老师的引领让我们从舒适区迈出开启了这段充满挑战与乐趣的深度学习征程