news 2026/6/3 13:12:56

【Python学习打卡-Day33】你好,PyTorch!从“自动挡”到“手动挡”的深度学习之旅

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python学习打卡-Day33】你好,PyTorch!从“自动挡”到“手动挡”的深度学习之旅

📋 前言

各位坚持打卡的伙伴们,大家好!今天是学习之旅的第 33 天,我们将在这一天完成一次重要的“座驾升级”。

如果说之前我们使用的scikit-learn是一辆自动挡汽车——三行代码model.fit(),model.predict()就能轻松上路,那么从今天开始,我们就要学习驾驶一辆手动挡赛车——PyTorch。你需要亲手控制离合(数据)、挂挡(模型)、踩油门(训练),过程更复杂,但你能榨干发动机的每一分性能,实现更高阶的驾驶技巧。

准备好了吗?让我们从安装环境开始,正式进入深度学习的匠心世界!


一、核心知识点总结

1. 环境准备:为“赛车”修建专用赛道

  • 独立环境:深度学习项目依赖复杂,创建一个全新的 Conda 环境 (conda create -n DL python=3.8) 是最佳实践。这就像为你的赛车修建一条专用赛道,避免与其他车辆(项目)互相干扰。
  • CPU vs. GPU
    • CPU (博士):核心少但能力强,擅长复杂的串行任务。
    • GPU (成百上千的小学生):核心多但能力单一,擅长简单的并行计算。
    • 深度学习的矩阵运算正是这种“简单重复”的工作,所以 GPU 是首选。
  • CUDA:NVIDIA 显卡的“官方加速驱动”。安装 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 的精髓,一个标准的训练循环包含雷打不动的五个步骤:

  1. 前向传播outputs = model(X_train)- 将数据喂给模型,得到预测结果。
  2. 计算损失loss = criterion(outputs, y_train)- 比较预测结果和真实标签,计算差距。
  3. 梯度清零optimizer.zero_grad()- 清除上一轮的梯度信息,准备新一轮计算。
  4. 反向传播loss.backward()- 根据损失,计算模型中每个参数应该调整的方向(梯度)。
  5. 参数更新optimizer.step()- 根据计算出的梯度,更新模型的所有参数。

这个循环,就是模型“学习”的过程。


二、实战作业:用 PyTorch 构建鸢尾花分类器

我们将使用经典的鸢尾花数据集,从零开始搭建、训练并评估一个简单的神经网络。

1. 我的代码 (CPU 版本)

# -*- coding: utf-8 -*-importtorchimporttorch.nnasnnimporttorch.optimasoptimfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScaler# 使用 StandardScaler 效果通常更好importmatplotlib.pyplotasplt# --- 1. 环境检查 ---print(f"PyTorch Version:{torch.__version__}")use_cuda=torch.cuda.is_available()device=torch.device("cuda:0"ifuse_cudaelse"cpu")print(f"当前使用的设备:{device}")ifuse_cuda:print(f"CUDA 设备名称:{torch.cuda.get_device_name(0)}")# --- 2. 数据准备 ---# 加载数据iris=load_iris()X,y=iris.data,iris.target# 划分数据集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)# 数据标准化scaler=StandardScaler()X_train=scaler.fit_transform(X_train)X_test=scaler.transform(X_test)# 转换为 PyTorch TensorsX_train_tensor=torch.FloatTensor(X_train).to(device)y_train_tensor=torch.LongTensor(y_train).to(device)X_test_tensor=torch.FloatTensor(X_test).to(device)y_test_tensor=torch.LongTensor(y_test).to(device)# --- 3. 模型架构定义 ---classMLP(nn.Module):def__init__(self,input_size,hidden_size,num_classes):super(MLP,self).__init__()self.fc1=nn.Linear(input_size,hidden_size)# 输入层 -> 隐藏层self.relu=nn.ReLU()# 激活函数self.fc2=nn.Linear(hidden_size,num_classes)# 隐藏层 -> 输出层defforward(self,x):out=self.fc1(x)out=self.relu(out)out=self.fc2(out)returnout# 实例化模型input_dim=4hidden_dim=10output_dim=3model=MLP(input_dim,hidden_dim,output_dim).to(device)# 将模型移动到指定设备print("模型结构:")print(model)# --- 4. 定义损失函数和优化器 ---criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.01)# --- 5. 训练模型 ---num_epochs=500train_losses=[]test_accuracies=[]forepochinrange(num_epochs):model.train()# 设置为训练模式# 前向传播outputs=model(X_train_tensor)# 计算损失loss=criterion(outputs,y_train_tensor)# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()train_losses.append(loss.item())# --- 在每个 epoch 后进行评估 ---model.eval()# 设置为评估模式withtorch.no_grad():# 在评估阶段不计算梯度test_outputs=model(X_test_tensor)_,predicted=torch.max(test_outputs.data,1)correct=(predicted==y_test_tensor).sum().item()accuracy=100*correct/len(y_test)test_accuracies.append(accuracy)if(epoch+1)%50==0:print(f'Epoch [{epoch+1}/{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_outputs=model(X_test_tensor)_,final_predicted=torch.max(final_outputs.data,1)final_correct=(final_predicted==y_test_tensor).sum().item()final_accuracy=100*final_correct/len(y_test)print(f'\n最终在测试集上的准确率:{final_accuracy:.2f}%')

三、学习心得:拥抱“过程”的乐趣

sklearnPyTorch,最直观的感受是代码量变多了,但自由度也变得无限大。这让我深刻体会到:

  1. 没有什么是理所当然的sklearn把数据处理、模型训练、评估都封装好了,而PyTorch强迫我们去思考每一步的细节:数据为什么要归一化?为什么要转成 Tensor?训练循环的每一步到底在干什么?
  2. 过程即是掌控:虽然写了更多代码,但我对模型内部发生的事情有了前所未有的掌控感。我可以随时打印出中间层的输出,可以自定义损失函数,可以精细地调整学习率。这种“一切尽在掌握”的感觉非常棒。
  3. 思维的转变:写PyTorch代码,更像是在搭建一个动态的系统,而不是调用一个静态的函数。这种从“使用者”到“创造者”的思维转变,是深度学习之旅中最宝贵的收获。

驾驶“手动挡”虽然初期会手忙脚乱,但当你熟练之后,人车合一的快感是“自动挡”无法给予的。PyTorch 正是如此。


最后,感谢 @浙大疏锦行 老师的引领,让我们从舒适区迈出,开启了这段充满挑战与乐趣的深度学习征程!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 17:11:44

YOLOv8平移、旋转、缩放变换对模型鲁棒性影响

YOLOv8平移、旋转、缩放变换对模型鲁棒性影响 在智能监控、无人机巡检或工业质检的实际场景中,摄像头捕捉到的目标很少以“教科书式”的姿态出现。一辆车可能倾斜45度停在斜坡上,一个零件可能随机散落在传送带边缘,远处的行人小如像素点——这…

作者头像 李华
网站建设 2026/6/2 8:10:05

YOLOv8推理速度实测:CPU vs GPU性能差距有多大?

YOLOv8推理速度实测:CPU vs GPU性能差距有多大? 在智能安防摄像头实时识别行人、无人机自动避障、工厂流水线缺陷检测这些场景背后,目标检测模型正以毫秒级响应驱动着决策链条。而当开发者真正把训练好的YOLOv8模型部署到实际系统中时&#x…

作者头像 李华
网站建设 2026/5/20 11:35:19

YOLOv8目标检测全流程:从git clone到模型推理

YOLOv8目标检测全流程:从git clone到模型推理 在智能安防摄像头自动识别可疑行为、工业质检流水线毫秒级发现产品缺陷的今天,一个高效稳定的目标检测系统已成为AI落地的关键环节。而在这背后,YOLOv8正凭借其“快准稳”的特性,成为…

作者头像 李华
网站建设 2026/6/2 5:48:57

ArcGIS大师之路500技---049状态栏的设置

文章目录前言一、 状态栏的显示二、 坐标单位变换前言 本文主要介绍ArcGIS状态的显示与隐藏,状态栏显示单位切换等知识。 一、 状态栏的显示 当我们找不到状态栏的时,如下图: 我们可以在视图—状态栏前打勾,如下图&#xff1a…

作者头像 李华
网站建设 2026/5/30 4:54:51

R语言GPT代码辅助实战(AI赋能调试新范式)

第一章:R语言GPT代码辅助调试概述在现代数据分析和统计建模中,R语言因其强大的数据处理能力和丰富的扩展包而广受青睐。然而,编写高效、无误的R代码仍面临诸多挑战,尤其在复杂逻辑或高阶函数应用时,调试成本显著上升。…

作者头像 李华
网站建设 2026/5/20 23:54:50

YOLOv8多场景应用探索:工业质检、自动驾驶与安防监控

YOLOv8多场景应用探索:工业质检、自动驾驶与安防监控 在智能制造车间的高速生产线上,每分钟数百件产品飞速流转,传统人工质检早已无法满足精度与效率的双重需求;在城市道路中穿行的自动驾驶车辆,必须在百毫秒内识别出前…

作者头像 李华