核心要点
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 合并。现在:
x = torch.randn(3, requires_grad=True) # 直接参与 Autogradnn.Parameter 是特殊 Tensor,默认 requires_grad=True,注册为模型参数。
对比(现代视角):
| 概念 | 现代 PyTorch |
|---|---|
| 普通数据 | requires_grad=False 的 Tensor |
| 可训练参数 | nn.Parameter 或 requires_grad=True |
| 常量 | 不参与图的 Tensor |
读旧代码或教程看到 Variable(tensor) 应知已等价于 tensor.requires_grad_()。面试考此题多为确认你了解框架演进,而非让你用已废弃 API。详见 PyTorch 迁移说明。
常见误区
⚠️ 常见踩坑
新代码仍 import Variable;混淆 .data 修改与 inplace 安全;不知道 0.4 合并历史。
追问
追问 1:nn.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 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出
- Tensorflow
全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具