Pytorch-book之Tensor基础(一)

331 阅读2分钟

1. Tensor

Tensor是PyTorch中重要的数据结构,可认为是一个高维数组。它可以是一个数(标量)、一维数组(向量)、二维数组(矩阵)以及更高维的数组。Tensor和Numpy的ndarrays类似,但Tensor可以使用GPU进行加速。

1.1 初始化

import torch as t 
t.__version__

x = t.Tensor(5,3)#分配空间,未初始化
x = t.Tensor([[1,2],[3,4]])#指定值初始化
x = t.ones(5)#全1初始化
x = t.zeros(5,3)#全0初始化
x = t.rand(5,3)#[0,1]均匀分布初始化
x = t.randn(5,3)#正态分布初始化
x = t.arange(1,6,2)#间隔2
x = t.linspace(1,10,3,dtype = t.float)#均匀间隔取n个数
x = t.randperm(5)#长度未5的随机排列
empty_tensor = t.tensor([])#torch.Size([0])
x = t.eye(2,3,dtype = t.int)
b = x.numpy()#tensor转化为numpy
y = t.from_numpy(b)#numpy转化为tensor
old_tensor = x#直接赋值是共享内存
new_tensor = old_tensor.clone()#.clone()不共享内存

1.2 纬度相关

#查看纬度
x.size()#返回torch.Size([5, 3])
x.shape
#获取某个纬度的值
x.size(0)
x.size()[0]
#改变纬度:view不改变自身但共享内存,resize_改变自身
a = t.arange(0,6)
b = a.view(2,3)#返回新tensor,但是共享内存

#索引
a[0]
b[:,0]
a[0][1]#或者x[0,1]
b[:2,0:2]
b[None].shape#None类似np.newaxis新增一个轴
x[[1,2],[1,2],[2,0]]# 或者x[1,1,2]和x[2,2,0]
#自动广播会朝大纬度扩展

1.3 类型

t.set_default_tensor_type('torch.FloatTensor')
b = a.float() #b=a.type(t.FloatTensor)或者c = a.type_as(b)

1.4 选择函数

a>1#bool类型的tensor
a[a>1]#等价于a.masked_select(a>1)
#gather选对角线元素省略,scatter_把数据放回去

1.5 常用方法

1.5.1 逐元素运算

输入输出形状一致,加下划线原地操作

  • t.abs()/sqrt/div/exp/fmod/log/pow/cos/sin/asin/atan2/cosh/ceil/round/floor/trunc/clamp(input, min, max)/sigmod/tanh..
#加法
x+y
t.add(x, y, out=a) # 输入到result
x.add(y)#3种普通加法都不改变纬度
x.add_(y)#带_的方法是inplace,会改变本身

1.5.2 归并操作

输出一般小于输入形状

  • t.mean()/sum/median/mode/norm/dist/std/var/cumsum/cumprod
  • dim指定纬度:在哪个纬度就让哪个纬度为1:如果指定dim=2,输出的形状就是(m, n, 1)或者(m, n)

1.5.3 比较操作

  • gt/lt/ge/le/eq/ne/topk/sort/max/min
  • t.max(tensor):返回tensor中最大的一个数
  • t.max(tensor,dim):指定维上最大的数,返回tensor和下标
  • t.max(tensor1, tensor2): 比较两个tensor相比较大的元素
 #max
b = t.linspace(15, 0, 6).view(2, 3)
t.max(b, dim=1) 
# 第一个返回值的15和6分别表示第0行和第1行最大的元素
# 第二个返回值的0和0表示上述最大的数是该行第0个元素
  • 线性代数

1.6 cpu/gpu

device = t.device("cuda:0" if t.cuda.is_available() else "cpu")
x = x.to(device)#device(type='cpu')

1.7 自动求导autograd

#autograd
x = t.ones(2,2,requires_grad=True)#x = t.ones(2,2),x.requires_grad = True
y = x.sum()#tensor(4., grad_fn=<SumBackward0>)
y.grad_fn#是否为一个计算结果<SumBackward0 at 0x1290d66d0>
y.backward()#反向求导
x.grad#查看x节点的梯度,累加!
x.grad.zero_()#清零