【小白笔记】torch.Tensor 类的实例
张量实例(Tensor Instance)本身自带的能力是什么意思?
人话解释:
(张量实例)本身自带的能力,指的就是像 Python 内建数据类型(如 list
或 int
)一样,张量这个“数据变量”自己就附带了一系列可以直接使用的操作方法**。
1. 概念类比(以 Python 基础类型为例)
数据类型 | 实例(变量) | 自带的能力(方法) | 调用方式 |
---|---|---|---|
列表 (list ) | my_list = [1, 2] | .append(x) (在末尾添加) | my_list.append(3) |
字符串 (str ) | my_string = "hello" | .upper() (转大写) | my_string.upper() |
张量 (torch.Tensor ) | X_test | .to(device) (移动到设备) | X_test.to('cuda') |
2. 在 PyTorch 中的具体意义
在 PyTorch 中,当你执行了 X_test = torch.from_numpy(X_test).float()
之后:
X_test
不再是一个普通的 NumPy 数组或 Python 列表,它现在是一个torch.Tensor
类的实例。- 因为它是
torch.Tensor
,它就自动继承了torch.Tensor
类定义的所有方法。 - 这些方法就是我们所说的“自带的能力”,它们被设计用于高效地、直接地操作张量中的数据。
这是一个非常细致的问题,它涉及到 Python 中的面向对象编程和方法链式调用的原理。没有直接看到 torch.Tensor
,但它确实在幕后被创建了。
人话解释: 虽然代码里没有写出 torch.Tensor()
,但是 torch.from_numpy()
这个函数返回的结果,就是一个 torch.Tensor
类的实例。
详细分解:
来看您这行代码:
X_test=torch.from_numpy(X_test)⏟第一步:返回一个 Tensor 实例⏟第二步:调用这个实例的 .float() 方法.float()\text{X\_test} = \underbrace{\underbrace{\text{torch.from\_numpy}(\text{X\_test})}_{\text{第一步:返回一个 Tensor 实例}}}_{\text{第二步:调用这个实例的 .float() 方法}}\text{.float()}X_test=第二步:调用这个实例的 .float() 方法第一步:返回一个 Tensor 实例torch.from_numpy(X_test).float()
第一步:torch.from_numpy(X_test)
- 功能: 这是一个属于
torch
命名空间的静态函数(工厂函数)。它的工作就是接收一个 NumPy 数组作为输入,然后制造并返回一个新的 PyTorch 张量对象。 - 返回类型: 这个函数返回的对象,它的类型就是
torch.Tensor
。
第二步:.float()
- 功能: 由于第一步返回的对象是一个
torch.Tensor
实例,它自带了.float()
这个方法(能力)。 .float()
的作用: 这个方法会操作张量自身,将张量内所有数据元素的类型转换为 32 位浮点数(torch.float32
)。它执行完操作后,返回的仍然是那个torch.Tensor
实例(或者一个新类型的新实例)。
总结和记忆点
- 没有直接写出,但它就在那里: 你不需要写
X_test = torch.Tensor(torch.from_numpy(X_test))
,因为torch.from_numpy()
的返回值本身就已经是一个张量实例了。 - 方法链 (Chaining): 这种写法叫做方法链式调用。
A.method1().method2().method3()
- 只要
method1()
的返回结果是一个对象,并且这个对象拥有method2()
的能力,你就可以继续点(.
)下去。 - 在这个例子中,
torch.from_numpy(...)
的返回值拥有.float()
的能力,所以可以直接链式调用。
例如:
X_test.to(self.device)
:是Tensor
实例的移动能力。X_test.cpu()
:是Tensor
实例从 GPU 移到 CPU 的能力。X_test.unsqueeze(0)
:是Tensor
实例改变自己维度(形状)的能力。X_test.pow(2)
:是Tensor
实例对自身所有元素进行平方的能力。
总结:
在面向对象编程中,一个实例(对象)就是数据(属性)和操作(方法/能力)的结合体。当你用 X_test.
调用方法时,你就是在命令这个张量对象去执行它自己自带的功能。