视频链接:
不如语冰
文章 代码链接:
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)
arr0, 0 = 0
t0, 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) 的元素,服从以 meani,j 为均值、stdi,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为概率值的伯努利分布张量。