Pytorch小技巧收集

作者: 布口袋_天晴了 | 来源:发表于2019-08-08 14:13 被阅读5次

小技巧记录一

导语:批数据,矩阵相乘,处理过程
假设:
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进行相似度计算,即out*L^{T}

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代码

相关文章

网友评论

    本文标题:Pytorch小技巧收集

    本文链接:https://www.haomeiwen.com/subject/rnqxjctx.html