今天突然间想起来好久之前遇到的一个问题,虽然忘了具体的问题场景是啥了,但是最终的解决方案就是把用th.tensor 创建张量换成了用th.Tensor 创建张量,今天再来探究一下tensor和Tensor有什么区别?。
先看一下torch.tensor和torch.Tensor的官方文档。
torch.Tensor
首先torch.Tensor 是一个类,是包含单一数据类型元素的多维矩阵。更明确地说,它是默认张量类型torch.FloatTensor() 的别名。
也就是说,torch.Tensor() 的作用实际上跟 torch.FloatTensor() 一样,都是生成一个数据类型为 32 位浮点数的张量,如果没传入数据就返回空张量,如果有列表或者 narray 的返回其对应张量。
正因为 torch.Tensor 只包含单一的数据类型,所以后面文档就列出了不同数据类型对应的不同 Tensor。
torch.tensor
torch.tensor 是一个构造函数,通过复制输入数据来构建一个没有自动微分记录的张量(也成为叶张量)。
函数原型:
torch.tensor(data, *, dtype=None, device=None, requires_grad=False, pin_memory=False) → Tensor
可以发现data参数是必须要传的,如果想要生成空张量,也要传入一个空列表,data参数的类型可以是:list, tuple, NumPy ndarray, scalar和其他类型。
torch.tensor会从data中的数据部分做拷贝(而不是直接引用),根据原始数据类型生成相应的torch.LongTensor、torch.FloatTensor和torch.DoubleTensor等类型。
根据根据使用需求,有几种主要的创建张量的方法:
- 要使用预先存在的数据创建一个张量,可以使用
torch.tensor() ; - 要创建特定大小的张量,可以使用
torch.* 张量创建操作; - 要创建相同大小并且相同类型的张量,可以使用
torch.*_like 张量创建操作; - 要创建相同类型但是大小不同的张量,可以使用
torch.new_* 张量创建操作;
|