深度学习板子
杂项
Pytorch 特点:训练时需要加上 ls.backward() 而用训练结果作为测试集时我们应该用ls.detach.numpy()消除梯度并转换为numpy数组便于观测图像
auto_grad : https://blog.csdn.net/qq_43328040/article/details/108421469
张量形状:一般而言,输入张量t维度为[B,C,H,W],分别表示批大小,词嵌入深度,高和宽
1、常见数据处理
torch
torch.full(shape,num) 用于数据填充
torch.repeat_interleave(x,nums) 用于得到重复nums次的x
y=x.torch.reshape(-1,3) x.view(-1,3) view会修改张量本身,reshape不会
torch.cat([torch1,torch2],dim=-1) 表示在最后一个维度上对两个张量进行连接
torch.stack() :表示在新的维度上对两个张量进行连接
unsqueeze(1): 添加维度,比方说原张量[h,w],现在变成[h,1,w]
self.weight[:, None, None] :同样用于扩展维度,用None填充
arr[None,:] :对一维向量arr来说这个式子表示将arr转置,添加了一个维度
permute(0,2,1) :用于将张量原来顺序调整成函数中定义样子
flatten(2), flatten(0,1) :左边用于把第三个维度后全部压缩为一个维度,右边表示把第一第二两个维度压缩
广播机制:torch_a+torch_b时如果维度不一致会自动把缺少的那个维度在一个方向进行扩展,然后再相加。对于张量乘法,实际上是对两个张量最后两个维度进行矩阵乘法。
数据选取
np.argsort(x) :本来用sort()会排序数组,现在用argsort会得到排序后的索引(0~n-1)
random.sample(range(1,N), k) 从list序列中随机选k个不重复的
高级索引(Fancy Indexing):比切片索引更加灵活
## 1、提取被3整除的元素
list=range(1,100)
musk=list%3==0
get_divid_by3=list[musk]
## 或 get_divid_by3=[i for i in list if i%3==0]
## 2、掩码操作
patches: (batch_size, num_patches, patch_height, patch_width)
mask_ind:(batch_size,num_masked)
batch_ind:(batch_size,1)
mask_patches=patches[batch_ind,mask_ind]
这里像batch_ind:(batch_ind,1)第一个维度用于batch_size对齐,第二个用于筛选。随后再对已筛选好的用num_masked进一步筛
矩阵
x @ y=torch.matmul(x,y)表示矩阵乘法
np.linalg.matrix_power(P, 2023) 表示矩阵自乘2023次
元素选取
x[:m] 表示选取前m行元素
x[::2] 表示从左到右每两个元素选一个(相当于选偶数位)
x[::-1] 表示逆序选择所有元素
x[-1:] 表示选取x最后一个元素,并且保留维度。
掩码
y_embed = not_mask.cumsum(1, dtype=torch.float32) 其中.cumsum用于沿着某一维度计算累加和,比如[1,0,1,1]→[1,1,2,3]
2、常用库函数
nn.Linear 函数对输入向量最后一个维度进行处理,张量乘法是针对最后两个维度进行处理