深度学习 -- 什么是张量 pytorch中张量的几种创建方法

前言

在学习深度学习的过程中,遇到的第一个概念就是张量,张量在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中常见的几种创建方法就是这些了,以后如果遇到新的创建方法我也会在博客中进行分享,下篇博客中,我将学习,张量的一些变换以及计算。

猜你喜欢

转载自blog.csdn.net/fuhao6363/article/details/130304622