核心要点

  • Variable 在 0.4 后已合并入 Tensor

  • 历史:Variable 包装 Tensor 参与 Autograd

  • 现在用 requires_grad=True 的 Tensor

  • 能说明版本演进避免踩坑老教程

简要回答

历史背景PyTorch 0.3 及以前,Variable 包装 Tensor 以接入 Autograd:.data 存数值,.grad梯度requires_grad 控制是否求导;

PyTorch 0.4+Variable 与 Tensor 合并

标准回答

历史背景:PyTorch 0.3 及以前,Variable 包装 Tensor 以接入 Autograd:.data 存数值,.grad 存梯度,requires_grad 控制是否求导。

PyTorch 0.4+Variable 与 Tensor 合并。现在:

python
x = torch.randn(3, requires_grad=True)  # 直接参与 Autograd

nn.Parameter 是特殊 Tensor,默认 requires_grad=True,注册为模型参数。

对比(现代视角)

概念 现代 PyTorch
普通数据 requires_grad=False 的 Tensor
可训练参数 nn.Parameterrequires_grad=True
常量 不参与图的 Tensor

读旧代码或教程看到 Variable(tensor) 应知已等价于 tensor.requires_grad_()。面试考此题多为确认你了解框架演进,而非让你用已废弃 API。详见 PyTorch 迁移说明。

常见误区

⚠️ 常见踩坑

新代码仍 import Variable;混淆 .data 修改与 inplace 安全;不知道 0.4 合并历史。

追问

追问 1nn.Parameter 和普通 Tensor 区别?

题库专题:TensorFlow 中的计算图是什么?

nn.Parameter 是 Tensor 的子类,默认 requires_grad=True,关键在于赋值给 nn.Module 的属性时会被自动登记进 module.parameters(),从而被优化器更新、随 state_dict 保存、随 .to(device) 搬移。普通 requires_grad=True 的张量虽能求梯度,但不会自动注册为模型参数。

题库延伸:与本追问相关的专题题 → TensorFlow 中的计算图是什么?

追问 2叶子张量与非叶子区别?

用户直接创建或 Parameter 多为叶子,保留 .grad;中间运算结果为非叶子,默认 backward 后释放梯度。影响 hook 与调试。

追问 3为什么废弃 Variable?

题库专题:TensorFlow 中的 Variable 是什么?有何重要性?

Variable 与 Tensor 分两套类型让 API 割裂、易混淆(什么时候该包 Variable)。0.4 版把 Autograd 能力直接合进 Tensor,用 requires_grad 标志即可,代码更简洁统一、减少包装开销。如今 Variable(x) 只是返回 x 本身,纯为向后兼容保留。

题库延伸:与本追问相关的专题题 → TensorFlow 中的 Variable 是什么?有何重要性?

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具