前言
在学习深度学习的过程中,遇到的第一个概念就是张量,张量在pytorch中的计算十分重要,所以本篇博客记录本人学习张量的过程,以及自己的理解。
张量是什么?
张量是一个多维数组,它是标量、向量、矩阵的高维扩展
我们通常用三维张量去表示一张图像的数据
Tensor与Variable
张量在pytorch中是做求导计算的关键概念
Variable是torch.autograd中的数据类型,主要用于封装Tensor,进行自动求导
- data:被包装的Tensor
- grad:data的梯度
- grad_fn:创建Tensor的Function,是自动求导的关键
- requires_grad:指示是否需要梯度
- is_leaf:知识是否是叶子结点(张量)
Pytorch0.4.0版开始,Variable并入Tensor
- dtype:张量的数据类型,如 torch.FloatTensor,torch.cuda.FloarTensor
- shape:张量的形状,如(64,3,224,224)
- device:张量所在的设备,GPU/CPU,是加速的关键
如何创建张量?
直接创建
torch.tensor()
功能:从data创建tensor
- data:数据,可以是list,numpy
- dtype:数据类型,默认与data的一致
- device:所在设备,cuda/cpu
- requires_grad:是否需要梯度
- pin_memory:是否存于锁页内存
import torch
import numpy as np
a_np = np.ones((3,3))
tensor = torch.Tensor(
a_np,
dtype=None,
device=None,
requires_grad=False,
pin_memory=False,
)
print(tensor)
输出:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
torch.from_numpy(ndarray)
功能:从numpy创建tensor
注意事项:从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动
import torch
import numpy as np
a_np = np.array([[1,2,3,4],[1,2,3,4]])
# 创建张量
# print(torch.Tensor(a_np))
# 从numpy数据类型创建
a_tensor = torch.from_numpy(a_np)
print(a_tensor)
输出:
tensor([[1, 2, 3, 4],
[1, 2, 3, 4]], dtype=torch.int32)
如果更改numpy数组中的数据,tensor中的数据也会被改变,说明这两个数据是共享内存的。
a_np[0][0] = 2
print(a_tensor)
输出:
tensor([[2, 2, 3, 4],
[1, 2, 3, 4]], dtype=torch.int32)
依据数值创建
torch,zeros()
功能:依size创建全0张量
- size:张量的形状,如(3,3)、(3,224,224)
- out:输出的张量
- layout:内存中布局形式,有strided,space_coo等
- device:所在设备,gpu/cpu
- requires_grad:是否需要梯度
import torch
a_tensor = torch.zeros((3,3),out=None,layout=torch.strided,device=None)
print(a_tensor)
输出:
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
torch.zeros_like()
功能:依input形状创建全0张量
- intput:创建与input同形状的全0张量
- dtype:数据类型
- layout:内存中布局形式
a_tensor = torch.zeros((3,3),out=None,layout=torch.strided,device=None)
# print(a_tensor)
b_tensor = torch.zeros_like(
a_tensor,
dtype=None,
layout=None,
device=None
)
print(b_tensor)
输出:
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
torch.ones()
torch.ones_like()
全1张量的创建,创建方式与全0张量一样,就不过多赘述。
torch.full()
torch.full_like()
功能:依input形状创建全自定义数值的张量
- size:张量的形状
- fill_value:张量的值
a_tensor = torch.full((3,3),3)
b_tensor = torch.full_like(a_tensor,4)
print(a_tensor)
print(b_tensor)
输出:
tensor([[3, 3, 3],
[3, 3, 3],
[3, 3, 3]])
tensor([[4, 4, 4],
[4, 4, 4],
[4, 4, 4]])
torch.arange()
功能:创建等差的1维向量
- start:数列起始值
- end:数列“结束值”
- step:数列公差,默认为1
a_tensor = torch.arange(0,10,step=2)
print(a_tensor)
tensor([0, 2, 4, 6, 8])
注意:end的值不取
torch.linspace()
功能:创建均分的1维张量
注意事项:数值区间维[start,end] end是取的
- start:数列起始值
- end:数列结束值
- steps:数列长度
a_tensor = torch.linspace(1,100,20)
print(a_tensor)
输出:
tensor([ 1.0000, 6.2105, 11.4211, 16.6316, 21.8421, 27.0526, 32.2632,
37.4737, 42.6842, 47.8947, 53.1053, 58.3158, 63.5263, 68.7368,
73.9474, 79.1579, 84.3684, 89.5789, 94.7895, 100.0000])
torch.logspace()
创建对数均分的1维张量
- start:数列起始值
- end: 数列结束值
- steps:数列长度
- base:对数函数的底,默认为10
torch.eye()
功能:创建单位对角矩阵(2维张量)
- n:矩阵行数
- m:矩阵列数
依概率分布创建张量
torch.normal()
生成正态分布(高斯分布)
- mean:均值
- std:标准差
gaosi = torch.normal(0.5,0.25,size=(4,))
print(gaosi)
输出:
tensor([0.2068, 0.5469, 0.4644, 0.6587])
torch.randn()
torch.randn_like()
生成标准正态分布
- size:张量的形状
torch.rand()
torch.rand_like()
在[0,1)区间上,生成均匀分布
torch.randint()
torch.randint_like()
区间[low,high)上生成整数均匀分布
- size:张量形状
pytorh中常见的几种创建方法就是这些了,以后如果遇到新的创建方法我也会在博客中进行分享,下篇博客中,我将学习,张量的一些变换以及计算。