原链接:https://blog.csdn.net/qq_28418387/article/details/97971328
作者:AI学渣
前言
tensor是Pytorch中数据的基础单元,那么如何创建tensor,pytorch中提供了以下四种方式:
torch.Tensor()
torch.tensor()
torch.as_tensor()
torch.from_numpy()
那么这四种创建tensor的方式有什么区别呢,在具体使用中应该如何选择?
1、类型结构的区别
除了torch.Tensor()是类之外,其他三个都是函数
2、tensor数据类型的区别
可以先举个例子,首先创建一个numpy数组,分别使用这四种方式创建tensor,并打印输出,我们来看看输出的tensor的区别
从结果可以看出,初始状态为 整型的numpy数组,后三个的dtype都变成了torch.int32类型,只有第一个tensor好像变成了浮点型,我们再分别打印他们的dtype类型
torch.Tensor()果然是将整型的numpy数组转化成了torch.float32的浮点类型,那么为什么会有这样的转化呢?实际上,torch.Tensor()是将numpy数组转化成了tensor的默认数据类型,我们来看看tensor的默认数据类型是不是torch.float32类型
通过torch.get_default_dtype()函数获取到了tensor的默认数据类型,果然是torch.float32。
其他三种方法默认的是继承输入numpy数据类型,输入的是int整型,那么转化生成的tensor就是整型的,输入的是float浮点型,那么转化生成的就是浮点型
其他三种方法还提供了设置数据类型的参数dtype,在转换的过程中可以设置成我们想要的数据类型
3、存储方式的区别
我们接着上面的例子往下看,此时我们修改原numpy数组中的元素,看看经过四种方法转换后的tensor会不会有什么变化
发现了没有,在修改了原numpy数组中的元素之后,前两种方法转换出来的tensor并没有发生改变,这符合我们的正常逻辑,因为经过了转换相当于复制了一份,原数组的改变就不会影响转换后的tensor;而后两种方法转换出来的tensor本质上是和原数组共享内存的,所以numpy的变化也会导致转换后的tensor的变化。
那我们现在将变换后的tensor改回原来的值,看看原numpy数组是否也跟着发生了变化
原numpy数组也发生了变化!
4、tensor创建方法的选择
经过对比了之后,那么平时我们应该如何选择哪种方法来创建tensor呢?
在不考虑性能方面,一般情况下我们使用**torch.tensor()方法居多,那么如果要考虑性能方面,首先肯定是要从torch.as_tensor()以及torch.from_numpy()**这两种方法中选择,因为在创建tensor的过程中,它俩是共享内存的,不需要额外创建一份数据,。
但是这两个中选择哪个呢,答案是:torch.as_tensor(),因为torch.as_tensor()和torch.from_numpy()之间有个区别就是,torch.from_numpy()只能接收numpy数组,而torch.as_tensor()不仅可以接收numpy数组,还可以接收python的list类型数据