PyTorch中Parameter实现原理:data变量存储机制的疑问
PyTorch中Parameter的
data属性解析 首先明确核心事实:Parameter是Tensor的直接子类,它本身就是一个完整的Tensor实例,并非对Tensor的包装。你看到的data属性并非Parameter独有,而是所有PyTorch Tensor都具备的通用属性。
关于data属性的本质
- 不存在所谓“父Tensor”:Parameter实例本身就持有张量数据的存储。当你创建
Parameter(data=torch.tensor([1.,2.]))时,通过PyTorch内部的Tensor._make_subclass方法,传入的data张量的存储会被转移到新的Parameter实例中——换句话说,这个Parameter实例就是存储数据的那个Tensor对象。 data是Tensor基类的内置属性:对于任何Tensor(包括Parameter),data属性返回的是一个脱离autograd梯度追踪的视图。它和原张量共享底层数据存储,但对data的修改不会被记录到计算图中。举个例子:import torch p = torch.nn.Parameter(torch.tensor([1., 2.])) print(p.data is p) # 输出False,但二者共享底层存储 p.data.add_(1.) print(p) # 输出Parameter containing: tensor([2., 3.])- 为什么源码里看不到定义:
data并非普通的Python实例变量,它的实现是在PyTorch的C++核心代码中,属于Tensor类的底层特性,所以在Parameter的Python源码里找不到它的定义。
总结
- Parameter没有额外包装Tensor,它自己就是Tensor,因此能直接调用
*、tanh()等张量操作。 data属性是Tensor基类提供的,用来获取底层数据的无梯度视图,并非指向某个不存在的父对象。
内容的提问来源于stack exchange,提问作者olives
相关产品推荐
相关产品推荐

