一、安装环境
- 由于我直接使用的cpu
- 因此按照官网的下载语句,pip3 install torch torchvision torchaudio,我是使用的pip install torch torchvision torchaudio,好像有xformers版本不匹配的问题,更新一下,pip install -U xformers
- 需要注意的是,一定要在虚拟环境中才能使用torch
- ctrl+shift+p在vscode中换解释器
- 虽然在vscode中更换了解释器,但是使用语句还是会使用之前的解释器,索性直接在cmd中使用pip安装需要的包
- 在cmd中激活虚拟环境,conda activate + Name
- 在cmd中创建虚拟环境,conda create -n Name python==版本号
二、张量的创建
- 直接将numpy的数组或者list转换成tensor
arr = np.ones((3,3))
t = torch.tensor(arr)
- 或者根据torch.from_numpy()创建
- 这样创建的张量和numpy数组是共享内存的。修改一个另一个也会变。
arr = np.ones((3,3))
t = torch.from_numpy(arr)
- tensor.zeros()创建全0张量
out_t = torch.tensor([1])
t = torch.zeros((3,3),out = out_t)
- torch.zeros_like()
- 根据输入的形状创建全0张量
- torch.ones()和torch.ones_like()创建全1张量
- 自定义的全数值张量
- torch.full((3,3),10)3*3的全10的张量,和torch.full_like()
- 还有就是torch.arange(start,end,step),前闭后开
torch.arange(2,10,8)
>>>[2,4,6,8]
- 均分数列torch.linspace(2,10,5),前闭后闭
torch.linspace(2,10,5)
>>>[2,4,6,8,10]
torch.linspace(2,10,6)
>>>[2.0000,3.6000,5.2000,6.8000,8.4000,10.0000]
- 单位对角矩阵
- torch.eye()
torch.eye(n = 3)#n是矩阵行数,默认为方阵,也可以设置m列数
- torch.normal(mean,std),根据概率分布创建张量
- 应为mean和std分别有标量和张量的两种形式,所以这个函数总共有4种形式
#张量,张量
mean = torch.arange(1,5,dtype=torch.float)
std = torch.arange(1,5,dtype=torch.float)
t_normal = torch.normal(mean,std)
#标量 标量
t_normal = torch.normal(0.,1.,size(4,))#注意这里要有size的参数
#张量 标量
mean = torch.arange(1,5,dtype=torch.float)
std = 1
t_normal = torch.normal(mean,std)
- 使用==torch.randn(size = )==创建均值为0,标准差为1的标准正态分布随机采样的张量
import torch # 生成一个2x3的张量,其元素从标准正态分布中抽取
x = torch.randn(2, 3)
- 约68%的值会落在-1到1(一个标准差)之间。
- 约95%的值会落在-2到2(两个标准差)之间。
- 约99.7%的值会落在-3到3(三个标准差)之间。
因此,虽然`torch.randn`生成的随机数理论上可以取任何值,实际使用时你会发现绝大多数值会位于-3和3之间。
-
torch.randn_like()
-
常用的是==torch.rand()==和torch.rand_like()在【0,1)上生成均匀分布
import torch # 生成一个2x3的张量,其元素从0到1的均匀分布中抽取
y = torch.rand(2, 3)
-
torch.randint()和torch.randint_like()也是【0,1),不过是整数
-
torch.randperm()生成0到n-1的随机排列
-
torch.bernoulli()伯努力分布
三、张量操作
- torch.cat()和torch.stack()进行拼接
t = torch.ones((2,3))
t_0 = torch.cat([t,t],dim=0) #shape为(4,3)
t_1 = torch.cat([t,t],dim=1) #shape为(2,6)
#stack可以创建新维度进行拼接
t_2 = torch.stack([t,t],dim=2) #(2,3,2),在第三个维度上的堆叠两个t,则第三维度是2
t_3 = torch.stack([t,t],dim=0) #如果在已又维度上拼接,则会将其他的维度向后移动
- torch.chunk(input,dim=,chunks=)
a = torch.ones(2,5)
list_of_tensors = torch.chunk(a,dim=1,3) #就是按照列砍两刀,是一个列表
#大小为5/3向上取整
-
torch.split()
-
张量的索引index_select()
-
注意是对整行整列的索引
-
masked_selext()
-
注意返回值是一维的张量
-
ge()方法表示大于等于,gt表示大于,le()表示小于等于,lt()表示小于
-
张量改变形状,torch.reshape()
-
注意,当张量在内存中是连续的,则共享内存
-
当碰到-1的时候表示该维度不需要关心,由其他维度计算而来
-
交换张量的两个维度troch.transpose(input,dim=,dim=)
-
压缩和扩张torch.squeeze(dim=)
-
意思就是直接移除长度为一的轴,注意当且仅当
四、张量的数学运算
-
有大量加减乘除的运算
-
torch.add()
-
以及加法结合乘法和除法