news 2026/3/5 22:05:53

Day 78:【99天精通Python】深度学习入门 (PyTorch) 上篇 - 张量与自动求导

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 78:【99天精通Python】深度学习入门 (PyTorch) 上篇 - 张量与自动求导

Day 78:【99天精通Python】深度学习入门 (PyTorch) 上篇 - 张量与自动求导

前言

欢迎来到第78天!

从今天开始,我们将触及 AI 技术皇冠上的明珠——深度学习 (Deep Learning)
无论是 ChatGPT、AI 绘画,还是自动驾驶,它们背后的核心都是神经网络。而要搭建和训练神经网络,我们需要一个趁手的框架。

PyTorch是目前学术界和工业界最流行的深度学习框架之一(另一个是 TensorFlow)。它以动态图机制著称,代码写起来就像普通的 Python 代码一样自然、易调试。

本节内容:

  • PyTorch 安装与环境配置
  • 核心数据结构:张量 (Tensor)
  • 张量 vs NumPy 数组
  • 自动求导 (Autograd) 机制
  • 线性回归实战:手写第一个神经网络

一、环境准备

推荐安装 CPU 版本(学习足够用了)。如果你有 NVIDIA 显卡,可以安装 CUDA 版本。

# 访问 pytorch.org 查看适合你系统的命令pipinstalltorch torchvision

验证安装:

importtorchprint(torch.__version__)print(torch.cuda.is_available())# True 表示可以使用 GPU

二、张量 (Tensor):PyTorch 的基石

张量本质上就是一个多维数组,这和 NumPy 的ndarray非常像。
区别在于:张量可以运行在 GPU 上,且支持自动求导。

2.1 创建张量

importtorchimportnumpyasnp# 1. 直接创建x=torch.tensor([1,2,3])print(x)# 2. 从 NumPy 创建arr=np.array([[1,2],[3,4]])x_np=torch.from_numpy(arr)# 3. 随机/全0/全1 (API 和 NumPy 几乎一样)rand=torch.rand(2,3)# 0-1 均匀分布zeros=torch.zeros(2,3)ones=torch.ones(2,3)

2.2 张量运算

x=torch.tensor([10,20,30])y=torch.tensor([1,2,3])# 加减乘除 (Element-wise)print(x+y)# tensor([11, 22, 33])print(x*y)# tensor([10, 40, 90])# 矩阵乘法 (@ 或 matmul)a=torch.tensor([[1,2],[3,4]])b=torch.tensor([[5,6],[7,8]])print(a @ b)# 1*5+2*7=19 ...

2.3 GPU 加速 (如果有显卡)

iftorch.cuda.is_available():device=torch.device("cuda")x=x.to(device)# 把张量搬到显存y=y.to(device)z=x+y# 在 GPU 上计算print(z)# 结果无法直接转 numpy,必须先搬回 cpu# print(z.cpu().numpy())

三、自动求导 (Autograd)

深度学习的核心算法是反向传播 (Backpropagation),即根据误差计算梯度(导数),从而更新模型参数。
PyTorch 的autograd模块帮我们自动完成了这一复杂的微积分过程。

3.1 requires_grad

# 创建张量,并告诉 PyTorch:我要对它求导w=torch.tensor([1.0],requires_grad=True)x=torch.tensor([2.0])b=torch.tensor([3.0],requires_grad=True)# 前向传播 (Forward):构建计算图# y = w * x + by=w*x+b# 1*2 + 3 = 5# 后向传播 (Backward):自动计算梯度# 计算 dy/dw, dy/dby.backward()# 查看梯度print(w.grad)# dy/dw = x = 2.0print(b.grad)# dy/db = 1.0

原理:PyTorch 会在后台构建一张动态计算图,记录所有的操作历史。调用backward()时,它会沿着图反向走一遍,算出所有叶子节点(w,b)的梯度。


四、实战:手动实现线性回归

我们来模拟一个最简单的机器学习任务:拟合直线y = 2x + 5

4.1 准备数据

# 生成 100 个数据点# y = 2x + 5 + 噪声x_train=torch.rand(100,1)*10# 0-10 之间y_train=2*x_train+5+torch.randn(100,1)*0.5# 加点高斯噪声# 查看前5个print(x_train[:5],y_train[:5])

4.2 训练模型

我们要训练两个参数wb,让w*x + b尽可能接近y_train

# 1. 初始化参数 (随机猜一个)w=torch.randn(1,1,requires_grad=True)b=torch.randn(1,1,requires_grad=True)learning_rate=0.01# 学习率forepochinrange(1000):# 2. 前向传播:计算预测值y_pred=x_train @ w+b# 3. 计算损失 (Loss):均方误差 (MSE)loss=(y_pred-y_train).pow(2).mean()# 4. 反向传播:计算梯度# 每次 backward 前必须清零梯度,否则会累加!ifw.gradisnotNone:w.grad.zero_()b.grad.zero_()loss.backward()# 5. 更新参数 (Gradient Descent)# 使用 torch.no_grad(),因为更新参数的操作不需要记录进计算图withtorch.no_grad():w-=learning_rate*w.grad b-=learning_rate*b.gradifepoch%100==0:print(f"Epoch{epoch}: Loss ={loss.item():.4f}")print(f"训练结果: w={w.item():.2f}, b={b.item():.2f}")# 预期接近 w=2.00, b=5.00

五、常见问题

Q1:为什么要grad.zero_()

PyTorch 设计为梯度累加。如果不清零,第 2 轮的梯度 = 第 1 轮梯度 + 第 2 轮梯度,这会导致更新方向错误。

Q2:with torch.no_grad():是什么?

在更新参数w -= lr * w.grad时,这只是一个数值更新操作,我们不希望 PyTorch 把它也算作计算图的一部分(否则下次 backward 会出错)。这也用于推理阶段(Inference)以节省内存。

Q3:tensor.item()

当张量只包含一个数值时(scalar),用.item()把它转为 Python 的 float/int。


六、小结

PyTorch 基础

Tensor (张量)

Autograd (自动求导)

训练流程

多维数组

支持 GPU

requires_grad=True

backward()

tensor.grad

Forward (算 Loss)

Backward (算梯度)

Update (减梯度)

Zero Grad (清零)

关键要点

  1. Tensor是深度学习的数据容器。
  2. Autograd让反向传播变得自动化。
  3. 训练循环 4 步走:算预测 -> 算 Loss -> Backward -> 更新参数。

七、课后作业

  1. 二次函数拟合:修改上面的代码,尝试拟合曲线y = 3x^2 + 2x + 1。(提示:你需要三个参数w1, w2, b,或者构造特征x^2)。
  2. GPU 加速体验:如果你的电脑有显卡(或使用 Colab),尝试将张量移动到.to('cuda')上运行,对比大数据量下的矩阵乘法速度。
  3. 手动求导:复习一下高数,手动计算y = w*x + bw的偏导数,看看和w.grad的值是不是一样。

下节预告

Day 79:深度学习入门 (PyTorch) 下篇 - 神经网络 (nn.Module)- 手动更新参数太累了。明天我们学习 PyTorch 的高级 API,用搭积木的方式构建真正的神经网络!


系列导航

  • 上一篇:Day 77 - 计算机视觉OpenCV
  • 下一篇:Day 79 - 深度学习PyTorch下(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 10:00:27

Day 83:【99天精通Python】机器学习进阶 - 分类问题与逻辑回归

Day 83:【99天精通Python】机器学习进阶 - 分类问题与逻辑回归 前言 欢迎来到第83天! 在昨天的课程中,我们学习了回归 (Regression) 问题,即预测一个连续的数值(如房价)。 今天,我们要学习机器学…

作者头像 李华
网站建设 2026/3/4 10:00:29

MinerU提交bug指南:问题反馈规范与日志收集

MinerU提交bug指南:问题反馈规范与日志收集 1. 引言 1.1 背景与需求 在使用 MinerU 2.5-1.2B 深度学习 PDF 提取镜像 过程中,尽管系统已实现“开箱即用”的便捷体验,但在处理复杂排版文档(如多栏、表格、公式密集型科技论文&am…

作者头像 李华
网站建设 2026/3/4 14:01:35

为什么SenseVoiceSmall部署卡顿?显存优化实战案例解析

为什么SenseVoiceSmall部署卡顿?显存优化实战案例解析 1. 问题背景与场景描述 在语音理解领域,阿里巴巴达摩院开源的 SenseVoiceSmall 模型因其支持多语言、情感识别和声音事件检测等富文本能力,正被广泛应用于智能客服、会议记录、内容审核…

作者头像 李华
网站建设 2026/3/4 10:00:29

qthread定时器功能从零实现示例

用 QThread 手搓一个定时器:从原理到实战的完整指南你有没有遇到过这样的场景?想让程序每200毫秒读一次传感器数据,或者每隔几秒刷新一下界面状态。最直接的想法是写个while循环加sleep()——但很快发现,主线程卡死了,…

作者头像 李华
网站建设 2026/3/4 10:00:28

通义千问2.5高效微调:QLoRA低资源训练部署实战

通义千问2.5高效微调:QLoRA低资源训练部署实战 近年来,大语言模型(LLM)在自然语言理解、代码生成、多模态任务等方面取得了显著进展。然而,全参数微调(Full Fine-tuning)对计算资源的高要求限制…

作者头像 李华
网站建设 2026/3/4 10:00:28

OpenCore Legacy Patcher终极指南:5步让旧Mac重获新生的完整教程

OpenCore Legacy Patcher终极指南:5步让旧Mac重获新生的完整教程 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为那台陪伴多年的老Mac无法升级最新系统而…

作者头像 李华