针对 PyTorch 编程习惯的关键问题。在背诵代码时,理解何时需要写 torch. 前缀,何时不需要,是区分类方法/实例方法 和静态函数/命名空间函数的核心。
1. X_test = X_test.to(self.device) 为什么不用 torch. 前缀?
人话解释: 因为 .to() 这个功能,是 X_test 自己作为一个"物体"(张量实例)所拥有的"能力",而不是 PyTorch 这个"工具箱"里需要被调用的一个通用工具。
详细分解:
-
对象方法 (Instance Method):
- 谁拥有?
X_test这个张量实例拥有。 - 怎么调用? 必须通过实例名加点号(
.)来调用,即X_test.to(...)。 - 作用: 通常用于操作对象自身 的状态(比如把
X_test从 CPU 移动到 GPU)。 - 例子:
.to(),.unsqueeze(),.pow(),.cpu(),.tolist()。
- 谁拥有?
-
命名空间函数 (Namespace/Static Function):
- 谁拥有? 属于
torch命名空间(即 PyTorch 整个工具箱)。 - 怎么调用? 必须写
torch.前缀。 - 作用: 通常用于创建新的张量、执行数学运算、或者进行全局配置。
- 例子:
torch.manual_seed(),torch.from_numpy(),torch.sum(),torch.sqrt(),torch.argsort()。
- 谁拥有? 属于
2. 什么时候应该前缀 torch.?(背诵记忆指南)
请记住这个原则:
| 动作类型 | 必须加 torch. 前缀 |
不加 torch. 前缀 (通过实例调用) |
|---|---|---|
| 创建张量 | torch.from_numpy(), torch.tensor(), torch.zeros() |
|
| 通用运算 | torch.sum(), torch.sqrt(), torch.argsort() (对任何张量都适用的数学函数) |
|
| 配置/环境 | torch.manual_seed(), torch.device(), torch.cuda.is_available() |
|
| 张量移动 | X_test.to(device), tensor.cpu() |
|
| 张量形状 | tensor.unsqueeze(0), tensor.view() |
|
| 张量元素操作 | tensor.pow(2) (通常是 Python 运算符的重载,如 **2) |
针对您的 KNN 代码的记忆点:
-
需要
torch.的地方:torch.manual_seed()torch.device(...)torch.from_numpy(...)torch.sum(...)(数学函数)torch.sqrt(...)(数学函数)torch.argsort(...)(排序查找函数)
-
不需要
torch.的地方 (通过张量实例调用):X_train.to(self.device)x_new.unsqueeze(0)differences.pow(2)(这是Tensor对象的方法)k_nearest_labels_torch.cpu().tolist()
总之,如果你看到代码中没有点号 连接到 torch. 而是直接 对一个变量(比如 X_test)使用点号操作(.to()),那么这个操作就是这个变量(张量实例)本身自带的能力。