【PyTorch】torch.Tensor详解和常用操作 |
您所在的位置:网站首页 › torchfloattensor作用 › 【PyTorch】torch.Tensor详解和常用操作 |
学习教材: 动手学深度学习 PYTORCH 版(DEMO) (https://github.com/ShusenTang/Dive-into-DL-PyTorch) PDF 制作by [Marcus Yang](https://github.com/chenyang1999) 1.tensor简介在PyTorch中,torch.Tensor是存储和变换数据的主要工具。 Tensor与Numpy的多维数组非常相似。 Tensor还提供了GPU计算和自动求梯度等更多功能,这些使Tensor更适合深度学习。 2.创建Tensor2.1 直接创建一个5*3的未初始化的Tensor: x = torch.empty(5,3)2.2 创建一个5*3的随机初始化的Tensor torch.rand:返回一个张量,包含了从区间[0,1)的均匀分布中抽取一组随机数,形状由可变参数size定义。 原型: torch.rand(size,out=None,dtype=None,layout=torch.strided,device=None, requires_grad=False)->Tensor举例: x = torch.rand(5,3)torch.randn:返回一个张量,包含了从标准正态分布(Normal distribution)(均值为0,方差为1,即高斯白噪声)中抽取一组随机数,形状由可变参数sizes定义。 x = torch.randn(2,3)2.3 创建全为0的Tensor(指定数据类型) x = torch.zeros(5,3,dtype=long)2.4 根据数据直接创建 x = torch.tensor([5.5,3])2.5 tensor.new_ones:返回一个与size大小相同的用1填充的张量; 默认情况下,返回的Tensor具有与此张量相同的torch.dtype和torch.device; >>> tensor = torch.tensor((), dtype=torch.int32) >>> tensor.new_ones((2, 3)) tensor([[ 1, 1, 1], [ 1, 1, 1]], dtype=torch.int32)2.6 torch.rand_like:返回与输入相同大小的张量,该张量由区间[0,1)上均匀的随机数填充。 原型: torch.rand_like(input,dtype=None,layout=None,device=None,requires_grad=False, memory_format=torch.preserve_format)->tensortorch.rand_like(input)相当于 torch.rand(input.size(),dtype=input.dtype,layout=input.layout,device=input.device)举例: x = torch.rand_like(x,dtype=torch.float)2.7 torch.arange:根据(首,尾,步长)生成tensor 2.8 其余tensor的构造函数 Tensor(*sizes) 基础构造函数 ones(*sizes) 全1Tensor zeros(*sizes) 全0Tensor eye(*sizes) 对角线为1,其他为0 arange(s,e,step) 从s到e,步长为step linespace(s,e,steps) 从s到e,均匀切分成steps份 normal(mean,std)/uniform(from,to) 正态分布/均匀分布 randperm(m) 随机排列这些创建方法都可以在创建的时候指定数据类型dtype和存放device(cpu/gpu) 3.Tensor的操作3.1 Tensor的加法操作: 加法形式一: x = torch.rand(5, 3) y = torch.rand(5, 3) z = x + y加法形式二: z=torch.add(x,y) result = torch.empty(5, 3) torch.add(x, y, out=result)加法形式三: y.add_(x)2.2 Tensor的索引操作: 我们还可以使用类似Numpy的索引操作来访问Tensor的一部分。需要注意的是:索引出来的结果与原数据共享内存,也即修改一个,另一个也会跟着修改。 y = x[0,:] y += 1 print(y) print(x[0,:])除了常用的索引选择数据之外,PyTorch还提供了一些高级的选择函数: index_select(input,dim,index) 在指定维度dim上选取过,比如选取某些行,某些列 masked_select(input,mask) 例子如上,a(a>0),使用ByteTensor进行选取 non_zero(input) 非0元素的下标 gather(input,dim,index) 根据index,在dim维度上选取数据,输出的size与index一样的 4.Tensor数据类型的转换使用独立的函数如 int(),float()等进行转换 long_tensor = tensor.long() features = features.float()使用torch.type()函数 t2=t1.type(torch.FloatTensor)使用type_as()函数 t3=t1.type_as(t2) 5. Tensor的形状修改5.1 view() 用view()来改变Tensor的形状: y = x.view(15)-1所指的维度可以根据其他的维度推出来 注意: view()返回的新tensor与源tensor共享内存,实际上就是同一个tensor,也就是更改一个,另一个也会跟着改变。 (顾名思义,view()仅仅改变了对这个张量的观察角度) Pytorch中的Tensor支持包含一百多种操作,包含转置,索引,切片,数学运算,线性代数,随机数等。 6. Tensor的数据转换6.1 item() 作用:它可以将一个标量Tensor转换为一个Python number: x = torch.randn(1) x.item()6.2 Tensor 转 NumPy 使用numpy()将Tensor转换成NumPy数组: 注意,这样产生的NumPy数组与Tensor共享相同的内存,改变其中一个另一个也会改变! a = torch.ones(5) b = a.numpy() # 转为numpy6.3 NumPy数组转Tensor 使用from_numpy()将NumPy数组转换为Tensor: 注意,这样产生的NumPy数组与Tensor共享相同的内存,改变其中一个另一个也会改变! a = np.ones(5) b = torch.from_numpy(a) 7. Tensor的广播机制当对两个形状不同的Tensor按元素运算时,可能会触发广播机制(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。 x = torch.arange(1, 3).view(1,2) #[1,2] y =torch.arange(1, 4).view(3,1) print(x+y)结果: tensor([[2, 3], [3, 4], [4, 5]]) 8.tensor运算的内存开销索引,view()是不会开辟新的内存的,而像y=x+y这样的运算是会开辟新的内存的,然后y指向新的内存。 9. Tensor ON GPU用方法to()可以将Tensor在CPU和GPU之间相互移动。 # 以下代码只有在PyTorch GPU版本上才会执⾏ if torch.cuda.is_available(): device = torch.device("cuda") # GPU x = torch.arange(1, 3).view(1,2) y = torch.ones_like(x,device=device) #直接创建一个在GPU上的Tensor x = x.to(device) # 等价于 .to("cuda") z = x + y print(z) print(z.to("cpu", torch.double)) # to()还可以同时更改数据类型转载:【PyTorch系例】torch.Tensor详解和常用操作_torch.tensor函数_大黑山修道的博客-CSDN博客 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |