【小白笔记】区分类方法/实例方法和静态函数/命名空间函数
针对 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()
),那么这个操作就是这个变量(张量实例)本身自带的能力。