视频链接:

不如语冰

不如语冰的个人空间-不如语冰个人主页-哔哩哔哩视频

文章代码链接:

GitHub - zyf-ngu/Qmatter: 跟着问题学-AI大模型入门系列笔记和代码 · GitHub

张量tensor创建

首先来谈一下张量的创建,创建的方法有2大类,一是由现有的数据直接转化而来,称为转化法;二是利用各种api函数传入想要创建张量的维度和形状,称为api法。

转化法torch.tensor()和torch.from_numpy

转化法是从现有的数据转化而来,现有的数据从哪里来呢?主要有2种:

(1)tensor()括号里的数据可以是列表list(以“[]”表示),即需要什么手动写什么,很少用;

(2)也可以是numpy,即先用numpy创建一个numpy数组,然后直接导入(如下);

   torch.tensor([1]) 

  

    arr = np.array([[1, 2, 3], [4, 5, 6]])

    t = torch.tensor(arr, device='cuda')

值得注意的点:

(1)注意数据类型,有时候需要在数字后面加“.”表示float,因为求导时候需要float类型;

(2)可以添加device=’cuda’获得加速。

上述从numpy导入的数据是不共享内存的,还有一种导入方法:torch.from_numpy创建的tensor和原来的numpy共享内存,也即是说修改tensor就会修改原来的numpy。如下

    arr = np.array([[1, 2, 3], [4, 5, 6]])

    t = torch.from_numpy(arr)

      # arr[0, 0] = 0

     t[0, 0] = -1

Api法

特殊数字torch.zeros()/ones()/eye()/full()

此类方法的共性就是利用给定的api函数,如zeros,ones,eyes,full,然后在参数里指定想要创建的张量的形状(用元组表示),即可完成创建。

 (1)torch.zeros/ones(shape)创建全0/1张量:      tensor3 = torch.zeros/ones(2, 3)

(2)torch.full(shape,value)创建值全相同的张量: t = torch.full((3, 3), 2)

(3)torch.eye(shape)创建单位对角矩阵

(4)torch.zeros_like(tensor),torch.ones_like(tensor),torch.full_like(tensor,value)创建和参数张量(本质用真实的张量形状代替指定的形状)一致的全0/1张量。

  

等差均分torch.arange&linespace

此类方法创建的是一维张量,

(1)torch.arange(start,end,step)创建等差数列张量,step为等差值,默认为1,取值时[start,end)左闭右开,形状大小=(end-start)/step。

       t = torch.arange(2, 10, 2)

  (2)torch.linspace(start,end,n),代表创建的张量在[start,end]中数值均分n等份,这时会出现小数。左右均闭。  t = torch.linspace(2, 10, 6)

  (3)torch.logspace(),等log创建,在对数尺度上从 start 到 end 均匀取 steps 个点,再通过底数 base 转换为线性尺度的数值。tensor11=torch.logspace(0,2,5)  # [  1.0000,   3.1623,  10.0000,  31.6228, 100.0000]

概率

此类方法的本质是依据想要使用的概率分布来创建符合要求的张量,关键还是确定张量的形状。

以正态分布为例:首先参数要有概率分布的超参数,比如正态分布标准值和方差,然后根据超参数的类型(可以是标量和张量(float类型))来决定是否需要额外指定张量的形状。

以 mean,std的组合为例,共有四种模式(2*2)。

mean1=torch.arange(1,5)  mean2=2.0;std1=torch.ones(3,1)    std2=0.3

模式1: mean为张量,std为标量——输出形状以mean的形状为准:tensor1=torch.normal(mean1,std2)

模式2: mean为标量,std为张量——输出形状以std的形状为准:tensor2=torch.normal(mean2,std2)

模式3: mean和std均为标量——必须指定输出张量的形状(size参数)tensor3=torch.normal(mean2,std2,size=(2,3))

模式4: mean和std均为张量,形状需要可广播,否则会引发运行时错误

tensor_normal3=torch.normal(mean1,std1)

在实际应用中,最常用的是模式3(两个标量参数+指定形状)和模式1(一个张量均值+标量标准差)。

对于mean和std均为标量,多维张量的每个元素都是独立的正态分布样本,整体均值会接近设定的均值,整体标准差接近设定的标准差;维度不影响分布规律,仅决定张量的形状(如 (2,3) 表示 2 行 3 列的样本集合)。

对于mean或std为张量,创建张量逐元素对应:目标张量中位置 (i,j) 的元素,服从以 mean[i,j] 为均值、std[i,j] 为标准差的正态分布。

(1)torch.randn(shape),torch.randn_like(tensor)创建标准正态分布张量;

(2)torch.rand(shape),torch.rand_like(tensor)创建[0,1]均匀分布

(3)torch.randint(low,high),torch.randint_like(tensor,low,high)创建[low,high)均匀分布。

(4)torch.randperm(n),创建从0到n-1的随机排列张量

(5)torch.bernoulli(input),创建以input为概率值的伯努利分布张量。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐