小技巧记录一
导语:批数据,矩阵相乘,处理过程
假设:
0.self.L=(1000,300) 注:Embedding参考文
self.L = torch.nn.Embedding(1000, 300, padding_idx=0)
# num_embeddings (int) - 嵌入字典的大小
# embedding_dim (int) - 每个嵌入向量的大小
# padding_idx (int, optional) - 如果提供的话,输出遇到此下标时用零填充
1.数据批次大小为256
2.数据特征的维度为300
3.(256,300)---模型--->out=(256,300)
4.需要对高层特征out与整个数据L进行相似度计算,即
torch.mm(out, self.L.weight.transpose(1, 0))
# mm((256, 300), (300, 1000))=(256, 1000) - 矩阵乘法
5.假设每个样本有自己的候选集K个,且K<L,就需要对第4步的操作进行修改,每个样本(1, 300)都需要和自己的候选集(k,300)进行相似度计算,则,整个批次样本集(256, 300),整个批次样本自己的候选集(256, k, 300)需要进行矩阵乘法计算
batch=(256, 300) #2D
K = (256, k, 300) #3D
# 需要使用torch.mm的broadcast版本的举证相乘torch.matmul()
new_batch = batch.view(batch.size(0), -1, batch.size(1)) #reshape扩展维度
output = torch.matmul(new_batch, K.transpose(2, 1))
# matmul((256, 1, 300), (256, 300, k))=(256, 1, k)
new_out = output.view(output.size[0], output.size[2]) #reshape降维
注:步骤4与5,分别完成2D2D,2D3D,最终的输出都是2D,不过步骤5完成了对候选集的个数限制,可以对模型省一些时间。
注:torch.matmul有boardcast,所以相当于把自己要写的for循环给隐藏起来了,不必自己写一个显示的for循环,直接用torch.matmul就能够完成批量操作。
小技巧记录二
导语:torch相关的数据计算
记住pytorch的那些运算,方便直接运用
torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,eg:a(1,3) b
torch.mm(a, b)是矩阵a和b矩阵相乘,衔接处的维度要相等,eg:a(1,3) b(3,6)
小技巧记录三
导语:关于torch的GPU、CPU那些事
1.让程序智能选择可用的GPU显卡运行,加一下一句代码就ok
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
2.指定一张GPU显卡运行
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
3.指定多张GPU显卡运行
torch.nn.DataParallel(model,device_ids=[0,1,2])
4.问题:如何将GPU程序变为CPU程序?
一台服务器,就那么几个显卡,如何只有4张GPU显卡,那么做实验的时候,4个显卡就显得不够用。
参考文章:torch GPU代码改造为GPU代码