Pytorch tensor 的创建&操作

Pytorch 专栏收录该内容
17 篇文章 1 订阅

官方链接:https://pytorch.org/docs/stable/tensors.html


torch.Tensor 张量

Pytorch 命名规则:
如果张量方法后缀带下划线,则该方法会修改张量本身的数据 Tensor.add_
如果张量方法后缀没有下划线,则该方法会返回一个新的张量 Tensor.add

  • 16位整型 torch.ShortTensor
  • 32位整型 torch.IntTensor
  • 64位整型 torch.LongTensor
  • 16位浮点型 torch.HalfTensor
  • 32位浮点型 torch.FloatTensor
  • 64位浮点型 torch.DoubleTensor
  • torch.Tensor 默认是 torch.FloatTensor

torch.tensor & torch.Tensor

  • torch.tensor() 只接收数据,且使用之前需要初始化,默认参数不确定,变化比较大
  • torch.Tensor() 接收 shape,接收数据时需要是 list[ ] 格式

当传入 Python的浮点数的列表时,Pytorch 默认把浮点数转化为单精度浮点数;
Numpy 默认把浮点数转换为 双精度浮点数(Python语言没有单精度浮点数,默认的float 类型是双精度浮点数)
因此
通过Numpy中转后输出的 Pytorch张量使用的是双精度浮点数
直接通过 torch.tensor 函数转换的张量使用的是单精度浮点数

常用属性

  • a.dim() 维度(Dimension)
    维度:2
  • .size & .shape
    大小:[2,2]
  • .Tensor
    张量:[1,2;3,4]
  • .numel
    指 tensor 元素的个数

1、张量的创建

1.1 通过 torch.tensor 函数创建张量

通过 torch.tensor 不仅可以创建指定的张量,还可以用来进行转换。如果有预先的数据(list、ndarray),可以通过这个方法来进行转换。

data = torch.tensor([1,2,3,4])    							# 转换列表为 Pytorch张量
data = torch.tensor([1,2,3,4] ,dtype = torch.float32) 		# 指定数据类型为32位浮点数

data = torch.tensor(np.array([1,2,3,4]))					# 转换 Numpy数组为 Pytorch张量

# 查看张量类型  (Pytorch默认为32位单精度浮点类型 torch。)
>>> data.dtype
torch.float32

torch.tensor( [[1,2] , [3,4,5]] )  # 列表嵌套创建张量,错误:子列表大小不一致

# 转换张量类型 ,可以调用 .to(torch.int())方法  或者 在创建张量时指定类型
torch.tensor( [1,2,3] ).to(torch.int32)

在 torch.tensor 函数中,可以通过传入 dtype参数来指定生成的张量的数据类型,函数内部会自动做数据类型的转换。当传入的 dtype为 torch.float32 时,可以看到输出的张量分量多了一个小数点,而且当查看 dtype的值时,可以发现这个值变成了 torch.float32,即32位单精度浮点数。

一些能够转换为 Python 列表的类型也可以转换为 Pytorch张量,比如:range函数产生的迭代器可以被转换为 Python列表,从而进一步转换为张量;Pytorch可以转换Numpy数组为张量,而且保证张量的数据类型不发生改变。

Pytorch创建张量支持列表的嵌套,用 torch.tensor 可以创建矩阵和其他多维张量。

注意:子列表的大小要一致,不然会报错。


1.2 通过 Pytorch 内置函数创建张量

创建张量的第二种方式是使用 Pytorch内置的函数创建张量,通过指定张量的形状,返回给定形状的张量。

内置函数函 数 解 析
torch.rand(*size)返回 区间 [ 0 , 1 ] [0,1] [0,1] 上均匀分布的随机数填充的张量
torch.randn(*size)返回 一个服从均值为0和方差为1的正态分布,由随机数填充的张量
torch.randperm(n)返回 整数从0到n-1的整数随机排列
torch.zeros(*size)返回 一个全为标量 0 的张量
torch.ones(*size)返回 一个由1全填充的张量
torch.eye(n)返回 一个单位矩阵形张量,大小为 n x n
torch.empty(*size)返回一个包含未初始化数据的张量,张量的形状由变量的参数大小来定义
torch.full(size,fill_value)返回大小由fill_value填充的张量
torch.from_numpy(ndarray)从 numpy.ndarray创建一个张量,返回值和ndarray共享相同的记忆,修改相互影响
torch.randint(low=0,high, size)返回 低(包含)和高(不包含)之间 均匀生成的size个 随机整数填充的张量
torch.arange(start, end, step)返回1维张量,长度为 (end−start)/step ,半开区间 [start, end) 以step为步长
torch.range(start, end, step)返回 1维张量,长度为 (end−start)/step)+1 ,半开区间 [start, end) 以step为步长
torch.linspace(start, end, steps)返回 1维张量,包含在区间start 和 end 上均匀间隔的steps个点
torch.logspace(start, end, steps)返回 1维张量,包含在区间 1 0 s t a r t 10^{start} 10start 1 0 e n d 10^{end} 10end上以对数刻度均匀间隔的steps个点

1.3 通过已知张量 创建形状相同的张量

在已知某一张量时,可创建和已知张量相同形状的张量。另一个张量虽然和原始张量的形状相同,但是里面填充的元素可能不同。

复制函数函 数 解 析
torch.zeros_like(input)返回与输入大小相同的标量值0填充的张量
torch.ones_like(input)返回与输入大小相同的标量值1填充的张量
torch.empty_like(input)返回与输入大小相同的未初始化张量。
torch.full_like(input)返回一个与填充填充值的输入相同大小的张量。
torch.rand_like(input)返回与输入相同大小的张量,该张量由区间[0,1][0,1]上均匀分布的随机数填充
torch.randn_like(input)返回与输入相同大小的张量,该张量由均值为0和方差为1的正态分布中的随机数填充。
torch.randint_like(input)返回与张量输入相同形状的张量,该张量由在低(包含)和高(排他)之间均匀生成的随机整数填充。

1.4 通过已知张量 创建数据类型相同的张量

最后一种方法就是创建一个与已知张量形状不同但数据类型相同的新张量,这种方法较少使用。但在一定条件下,比如写设备无关的代码有一定的作用。


2、torch.Storage

一个torch.Storage是一个单一数据类型的连续一维数组。

每个torch.Tensor都有一个对应的、相同数据类型的存储。


3、张量的存储设备

Pytorch 张量可以在两种设备上存储,即 CPU & GPU,在没有指定设备的时候,Pytorch 会默认将张量存储到 CPU上;如果想转移张量到 GPU上,则需要指定张量转移到 GPU设备。

一般来说,GPU设备在 Pytorch上以 cuda:0 , cuda:1 … 指定,其中数字代表的是GPU设备的序号,如果一台机器上有 n个GPU,则 GPU设备的编号分别是 0,1 … n-1。

GPU设备的详细信息可以使用 nvidia-smi 命令查看,详细操作可见博文

对于上述前三种创建张量的方法中,可以在创建张量的函数的参数中指定 device参数(如 decive=“cpu” 或者 device="cuda:0"等) 来指定张量存储的位置。

torch.randn(3,3, device="cuda:0")				# 创建存储在 0号GPU上的张量

torch.randn(3,3, device="cuda:0").cpu()			# 将张量从0号GPU 转移到CPU上
torch.randn(3,3, device="cpu").cuda(1)	
torch.randn(3,3, device="cuda:0").to("cuda:1")

通过访问张量的 device属性可以获取张量所在的设备。

如果想将一个设备上的张量转移到另一个设备上:

  • 首先可以 使用 cpu方法把张量转移到 CPU上,
  • 其次可以使用 cuda方法把张量转移到 GPU上,其中需要传入具体的 GPU的设备编号;
  • 也可以使用 to方法把张量从一个设备转移到另一个设备,该方法的参数是目标设备的名称

注意:两个或多个张量之间的运算只有在相同设备上才能进行,否则会报错


4、Tensor 属性

属性解 析
torch.numel(input)->int返回input 张量中的元素个数

5、view() & reshape()

1. view()

view()方法作用于原来的张量,传入改变新张量的形状,新张量的总元素数目和原来的张量的元素的元素数目相同。

另外,假如新的张量有 N维,我们可以指定其他 N-1维的具体大小,留下一个维度大小指定为 -1,Pytorch 会自动计算那个维度的大小(注意 N-1维的乘积要能被原来张量的元素数目整除,否则会报错)。

view() 方法并不改变张量底层的数据,只是改变张量的存储形式。如果需要重新生成一个张量(复制底层数据),则需要调用 contiguous方法,调用这个方法的时候,如果张量的形状和初始维度形状的信息兼容(兼容的定义是新张量的两个连续维度的乘积等于原来张量的某一维度),则会返回当前张量,否则会根据当前维度形状信息和数据重新生成一个形状信息兼容的张量,并且返回新的张量。

当张量为长度12的张量时,调用 view方法变成 3x4 和 4x3 时不影响数据的地址。但是,当引入 转置transpose方法的时候,返回的新张量虽然还是共享底层的数据指针,但是维度和步长不再兼容,需要通过调用 contiguous 方法,才能生成一个新的张量。

2. reshape()

大多数情况下,Pytorch 的张量在改变形状的时候不需要调用 contiguous ,在某些情况下,如调用 view方法 以后再调用 transpose方法 和一个与初始张量形状不兼容的 view方法,会在 transpose方法 后面加 contiguous方法的调用。

在这种情况下,可以直接调用 reshape方法,该方法会在形状信息不兼容的时候自动生成一个新的张量,并自动复制原始张量的数据(相当于连续调用 view方法 和 contiguous方法)

3. contiguous()

contiguous() → Tensor

返回一个内存连续的有相同数据的tensor,如果原tensor内存连续则返回原tensor。

  • 2
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值