Pytorch的Tensors能够理解成Numpy中的数组ndarrays(0维张量为标量,一维张量为向量,二维向量为矩阵,三维以上张量统称为多维张量),可是Tensors 支持GPU并行计算,这是其最大的一个优势。git
本文首先介绍tensor的基础用法,主要tensor的建立方式以及tensor的经常使用操做。github
如下均为初学者笔记。数组
# 建立一个5行3列的矩阵,数据类型为long x = torch.empty(5,3,dtype=torch.long) # 相似的还有以下建立方式: x = torch.zeros() x = torch.ones() x = torch.ones_like(z) # 建立一个与z形状相同的全1张量。 x = torch.rand() x = torch.eye(2,2) # 2x2单位矩阵 x = torch.tensor([5.5, 3.0]) # 向量 # x = torch.tensor(5.5) 标量 # x = torch.tensor([[5.5, 3.0]]) 矩阵 # 对x从新赋值(第一种是5X3全1矩阵,第二种是随机,size与x相同,新制定type覆盖旧type) x = x.new_ones(5,3,dtype=torch.double) x = torch.randn_like(x,dtype=torch.float) # tensor与numpy array的相互转换,须要注意的是他们两个用的都是共同的内存空间,即无论哪个的值发生改变,另一个都会相应改变 # 从numpy array建立tensor x = torch.from_numpy(np.ones(5)) # tensor转化为numpy array,调用.numpy()便可 y = x.numpy() # 返回x的规模,返回值类型为元组tuple,张量也支持Numpy的shpae属性 x.size() # 改变张量的维度,与Numpy的reshape相似 x = torch.randn(4, 4) # torch.Size([4, 4]) y = x.view(16) # torch.Size([16]), equal to y = torch.reshape(x,[16]) z = x.view(-1, 8) # torch.Size([2, 8]),其中-1表示从其余维度大小推断当前维度大小 # note: 当张量使用了permute和transpose后,tensor占用的内存可能就变得不连续了,所以不能用view()函数来改变张量维度。必须先执行函数contiguous()使tensor占用内存空间连续,其次再使用view()函数改变维度才可。可是后续Pytorch增长了函数reshape()来改变tensor维度,至关于x.contigous().view()的功能,所以要改变维度直接使用y=torch.reshape(x,[16])便可。
# tensor的拼接 # cat(),不增长新的维度,在某维度上拼接tensor(理解向量或矩阵的拼接就行) # example 1 x = torch.randn(2,3) y = torch.randn(1,3) z = torch.cat((x, y), 0) # 在0维(行)拼接y (y做为x的新行,增长行),维度为(3,3) # example 2 x = torch.randn(2,3) y = torch.randn(2,1) z = torch.cat((x, y), 1) # 在1维(列)拼接y (y做为x的新列,增长列),维度为(2,4) # tensor的堆叠 # stack(),增长新的维度,在新的维度上拼接tensor(没法想象,能够理解成新建立一个维度,而后把要堆叠的tensor放上去,新维度的大小就为要堆叠tensor的个数) # 如下例子请注意堆叠后新size中3的位置 # example 1 x = torch.randn(1,2) y = torch.randn(1,2) z = torch.randn(1,2) p = torch.cat((x, y,z), 0) # 在第0维度上堆叠,维度为 (3x1x2) # example 2 x = torch.randn(1,2) y = torch.randn(1,2) z = torch.randn(1,2) p = torch.cat((x, y,z), 1) # 在第1维度上堆叠,维度为 (1x3x2) # example 3 x = torch.randn(1,2) y = torch.randn(1,2) z = torch.randn(1,2) p = torch.cat((x, y,z), 2) # 在第2维度上堆叠,维度为 (1x2x3) # tensor交换两个维度,size中对应维度大小也交换,二维状况下类比于二维矩阵的转置 # transpose() # exmample x = torch.randn(1,2) x = x.transpose(0,1) # equal to x.transpose_(0,1) print(x.size()) # torch.Size([2, 1]) # note: 通常状况下,函数后面有加_,如x.transpose_(0,1),才会直接对原始tensor x进行操做,不然是返回一个新的tensor,而原始tensor x保持不变。 # tensor交换多个维度,size中对应维度大小也交换 # permute() # example x = torch.randn(1,2,3) x = x.permute(2,0,1) # 理解为第零维度用原始第二维度填充,第一维度用原始第零维度填充,第二维度用原始第一维度填充 print(x.size()) # torch.Size([3, 1, 2]) # tensor压缩和解压维度 # squeeze(dim):若是dim维为大小为1,则去除,不然不作任何变化。如若不指定dim,则去除全部大小为1的维度。 # unsqueeze(dim):在dim上添加一个维度,维度大小为1。 # example z = torch.randn(1,2) z.squeeze_() print(z.size()) # torch.Size([2]) z.unsqueeze_(1) print(z.size()) # torch.Size([2, 1]) # note: 另一些经常使用的方法,好比.sum()、.max()、x[1:]等基本操做都与numpy中的用法相似。
本文参考-1函数
本文参考-2code