深度学习--第4篇: Pytorch张量介绍与创建

1. 张量介绍

张量是一个包含多个同类数据类型的多维数组, 是标量,向量和矩阵的高维拓展.

Tensor与Variable
Variable是torch.autograd中的数据类型,主要用于封装Tensor,进行自动求导.由于在pytorch0.4.0之后,将Variable并入tensor中,因此后面都使用tensor来封装数据.
其中tensor包含以下模块: (Tensor与tensor相同)

  • data: 被包装的Tensor;
  • dtype: 张量的数据类型,如torch.FloatTensor torch.cuda.FloatTensor;
  • shape: 张量的形状, 如(3,640,480);
  • device: 张量所在设备, GPU/CPU, 是加速的关键;
  • grad: data的梯度;
  • grad_fn: 创建tensor的Function, 是自动求导的关键;
  • requires_grad: 指示是否需要梯度;
  • is_leaf: 指示是否是叶子节点(张量);

2. 张量创建

2.1 张量数据类型

Data typedtypeCPU tensorGPU tensor
32位浮点型torch.float32 / torch.floattorch.FloatTensortorch.cuda.FloatTensor
64位浮点型torch.float64 / torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor
32位整型torch.int32 / torch.inttorch.IntTensortorch.cuda.IntTensor
64位整型torch.int64 / torch.longtorch.LongTensortorch.cuda.LongTensor

2.2 直接创建

torch.tensor()

# 原始tensor类
torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)

功能: 从data创建tensor
 - data: 数据,可以从list,numpy获取
 - dtype: 数据类型,默认与data一致
 - device: 所在设备,cuda/cpu
 - requires_grad: 是否需要梯度
 - pin_memory: 是否存于锁页内存

torch.tensor() 例子说明:

a = torch.tensor([[1,2,3],[4,5,6]])
a.data   # 显示数据
# 结果
tensor([[1, 2, 3],
        [4, 5, 6]])
a.dtype   # 显示数据类型  torch.int64
a.requires_grad  # 是否需要梯度  False
a.grad    # 显示梯度(由于本例没有梯度,所以没有)
a.device  # 显示设备  device(type='cpu')

torch.from_numpy(ndarray)
–从numpy中创建,需要注意的一点是它们的内存是共享的,即两者之一改变数据,另一个数据就发生改变。

#原始torch的类函数
torch.from_numpy(ndarray)

#功能: 从numpy创建tensor
注意事项: 两者共享内存

torch.from_numpy() 例子说明:

a=np.ones([2,2])    # numpy创建(2,2)全1矩阵,默认np.float64
torch.from_numpy(a) # numpy转换为tensor
# 结果
tensor([[1., 1.],
        [1., 1.]], dtype=torch.float64)

2.3 依据数值创建(形状)

关键字:

函数功能
torch.zeros()创建全0张量
torch.zeros_like()创建与input形状形同的全0张量
torch.ones()创建全1向量
torch.ones_like()创建与input形状形同的全1张量
torch.eye()创建单位对角矩阵(2维张量)
torch.full()可以设定值的张量创建
torch.full_like()根据input形状穿件设定值的张量
torch.linspace()创建均分的1维张量
torch.normal()创建可变参数的正态分布随机张量
torch.randn()创建标准正态分布的随机张量;(均值=0,方差=1)
torch.rand()创建区间在[0,1]上的均匀分布随机张量

由于ones()与zeros两者相似,因此仅介绍其中1个torch.zeros()

2.3.1 torch.zeros()

# 原始torch类函数
torch.zeros(size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

# 功能: 创建size大小的全0张量
 - size: 张量的形状大小,如(3,3)或者[3,3]
 - out: 输出的张量
 - layout: 内存中布局形式,包括strided, sparse_coo等
 - device: 所在设备, cuda/cpu
 - requires_grad: 是否需要梯度

# 实例
a = torch.zeros([2,2],dtype=torch.int64)

# 结果
tensor([[0, 0],
        [0, 0]])

torch.zeros_like()

torch.zeros_like(input, dtype=None, layout=torch.strided, device=None, requires_grad=False)

# 功能: 根据input形状创建全0向量

# 实例
a = torch.tensor( [[1,2,3],[4,5,6]] )
b = torch.zeros_like(a)

# 结果
tensor([[0, 0, 0],
        [0, 0, 0]])

2.3.2 其他的张量创建函数

# 创建单位对角矩阵,大小为(3,3)
a = torch.eye(3)

# 创建均分的1维张量,参数如下 [起始值, 结束值, 张量大小]
a = torch.linspace(1,6,3)   # tensor([1.0000, 3.5000, 6.0000])

# 创建数值可变张量,参数[张量形状, 张量的值]
a = torch.full([2,2],6)  # 形状(2,2),值全为6

# 根据input形状创建全为设定值的向量
a = torch.tensor( [[1,2,3],[4,5,6]] )
b = torch.full_like(a, 6)  # b大小为(2,3),值全为6

# 创建可设定参数的正态分布张量,均值=1,方差=0.02
a = torch.normal(1,0.02,[3,3]) # 大小为(3,3),均值=1,方差=0.02

# 创建标准正态分布的张量,均值=0,方差=1
a = torch.randn([3,3])  # 大小为(3,3) 均值=0,方差=1

# 创建均匀分布[0,1]区间的随机张量
a = torch.rand([3,3])  # 大小(3,3) 均匀分布
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值