pytorch
林子要加油
从事机器学习、NLP相关工作
展开
-
如何使用pytorch进行多GPU训练
pytorch使用多GPU训练有两种方式:DataParallel和ModelParallel,这里主要介绍DataParallel机制: DataParallel的机制是把每个minibatch分为GPU个数份儿,然后把原始模型复制到多个GPU上,在每个GPU上进行正向传播,在反向传播的时候,把梯度相加(而不是求平均)更新到原始模型上。两种指定GUP id的方式:通过环境变量:os.environ["CUDA_VISIBLE_DEVICES"]="1,2,3,4",好处是只对指定的ids的GPU.原创 2021-03-16 13:12:58 · 4557 阅读 · 1 评论 -
pytorch中的乘法
pytorch中的乘法pytorch中的乘法一共有四种,有*乘,torch.mul,torch.mm,torch.matmul。其中*乘和torch.mul都是element-wise的乘法,也就对应元素相乘。而后两种是数学上的矩阵乘法。pytorch的广播机制点积是broadcast的。broadcast是torch的一个概念,简单理解就是在一定的规则下允许高维Tensor和低维Tensor之间的运算。broadcast的概念稍显复杂,在此不做展开,可以参考官方文档关于broadcast的介原创 2021-01-09 22:44:59 · 5135 阅读 · 0 评论 -
pytorch Dataset与DataLoader
在模型训练或预测时,需要加载数据集,对数据集进行预处理,提取特征,并分批读取,在minibatch内对数据进行Padding。训练时用到的数据处理和预测时用到的数据的处理可以在同一个Dataset中,这样可以复用一些数据处理的函数。from torch.utils.data import Datasetclass MyDataset(Dataset): def __init__(self,is_train): pass def __getitem__(self, idx): pass d原创 2020-05-29 17:46:13 · 256 阅读 · 2 评论 -
在每个批内pad一个tensor
当一个Dataset处理完数据后,需要加载时,希望在一个mini batch内pad数据,把数据pad成这个批内最大的长度,减小不必要的显存消耗。torch给提供了这样的函数,在torch.nn.utils.rnn.pad_sequence函数。# 函数返回一个T x B x * 或 B x T x *的一个tensor,当batch_first=True时,B在前面。# 需要pad的tensor的维度放在第一个维度上。"""This function returns a Tensor of si原创 2020-05-27 19:24:34 · 303 阅读 · 0 评论 -
pytorch 分割一个tensor并求平均
pytorch的torch.add()及torch.split()函数import torch# outputs是一个[batch, seq, 40]维的tensor,把outputs分割成两个[batch, seq, 20]的tensor,并每个元素求平均值add = torch.add(*torch.split(outputs, 20, dim=2)) / 2原创 2020-05-27 10:05:17 · 4104 阅读 · 2 评论 -
pytorch LSTM的dropout参数
pytorch的LSTM及RNN的dropout不会对每个time step进行dropout,只对一层的输出设置了dropout。在新版本的pytorch中,对于1层的lstm,dropout参数无效了,就说明对每个时间步是不dropout的。源码中,也是最后一层的输出时才加上的dropout.for i in range(num_layers): all_output = [] for j, inner in enumerate(inners): l = i * num_direct原创 2020-05-26 16:11:05 · 11771 阅读 · 4 评论 -
pytorch的Embedding层
class torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False)num_embeddings (int) - 嵌入字典的大小embedding_dim (int) - 每个嵌入向量的大小padding_idx (int, optional) - 如果提供的话,输出遇到此下标时用零填充.原创 2020-05-25 16:19:56 · 2287 阅读 · 0 评论 -
深入理解交叉熵
在分类问题上,包括二分类和多分类,我们使用交叉熵作为损失函数,那什么是交叉熵?为什么选用交叉熵作为分类问题的损失函数?交叉熵又有什么优点和缺点?在pytorch中如何使用交叉熵损失函数的?参考:https://zhuanlan.zhihu.com/p/35709485https://zhuanlan.zhihu.com/p/61944055https://pytorch.org/docs/...原创 2020-05-08 13:13:51 · 269 阅读 · 0 评论 -
Albert_zh转化为pytorch版本
背景由于google提供bert_base_zh的参数太多,模型大太,大约400M,无论是使用bert进行fine-tuning或者是对bert进行再训练的训练成本会变大。所以就对bert进行了一些优化。主要从以下几个点对bert进行了优化:词嵌入向量的因式分解O(V∗H)−>O(V∗E+E∗H)O(V*H)->O(V*E +E*H)O(V∗H)−>O(V∗E+E∗H)...原创 2020-05-06 23:30:47 · 1625 阅读 · 5 评论 -
pytorch——随机数生成
在使用PyTorch做实验时经常会用到生成随机数Tensor的方法,比如:torch.rand()torch.randn()torch.normal()torch.linespace()在很长一段时间里我都没有区分这些方法生成的随机数究竟有什么不同,由此在做实验的时候经常会引起一些莫名其妙的麻烦。所以在此做一个总结,以供大家阅读区分,不要重蹈我的覆辙。均匀分布torch.rand(...原创 2020-05-02 13:12:12 · 487 阅读 · 0 评论 -
pytorch——unsqueeze与expand
torch中的unsqueeze()函数来增加一个维度,expand()函数以行或列来广播。# -*- encoding: utf-8 -*-import torch# 需求是对一个batch_size=2, seq_len=3的两个序列进行mask的扩展,# 扩展为[batch_size, seq_len, 4, seq_len]tokens = torch.tensor([[1,2...原创 2020-05-02 11:39:37 · 3023 阅读 · 0 评论 -
pytorch扩展tensor的一个维度或多个维度
在使用神经网络的过程中,经常会用到把一个tensor扩展一个或多个维度的情况,然后把扩展后的维度用来广播。扩展一个维度的情况,使用unsqueeze()函数,缩小一个维度使用squeeze()函数。参数是dim,是一个int。也就是说只能扩展或缩小一个维度。t = torch.tensor([[1,2,3]])t = t.unsqueeze(0)#t.shape#[1, 1, 2]...原创 2020-05-01 10:10:56 · 12792 阅读 · 0 评论 -
pytorch使用Bert
主要分为以下几个步骤:下载模型放到目录中使用transformers中的BertModel,BertTokenizer来加载模型与分词器使用tokenizer的encode和decode 函数分别编码与解码,注意参数add_special_tokens和skip_special_tokensforward的输入是一个[batch_size, seq_length]的tensor,再需要注...原创 2020-05-01 00:35:12 · 2571 阅读 · 3 评论 -
pytorch——使用tensorobard不刷新的问题
在tensorflow中可以使用tensorboard来查看训练过程中loss的变化,来判断模型是否已经收敛 ,或者需要查看train dataset与dev dataset上效果来判断是否有过拟合的现象。pytorch中已经集成了tensorboard的API,不用再使用tensorboardX来调用api了。但是启动tensorboard的web页面时,需要安装tensorboard。并且不...原创 2020-04-28 23:22:05 · 4680 阅读 · 3 评论 -
pytorch的einsum
# -*- coding: utf-8 -*-import torch# 转置a = torch.arange(6).reshape(2, 3)print('a:{}'.format(a))b = torch.einsum('ij->ji', [a])print(b.size())print(b)# 求和b = torch.einsum('ij->', [a])...原创 2020-04-17 23:20:42 · 719 阅读 · 0 评论 -
pytorch model.train和 model.eval
在模型训练和测试(包括evaluate或test)两个过程中,需要添加相应的代码,包括 model.trian()和model.eval(),为什么一定要添加,两者有什么区别?model.train() :启用 BatchNormalization 和 Dropoutmodel.eval() :不启用 BatchNormalization 和 Dropout...原创 2020-04-12 18:19:48 · 791 阅读 · 0 评论 -
pytorch pin_memory()
在创建Dataloader的使用pin_memory()函数pin_memory就是锁页内存,创建DataLoader时,设置pin_memory=True,则意味着生成的Tensor数据最开始是属于内存中的锁页内存,这样将内存的Tensor转到GPU的显存就会更快一些。主机中的内存,有两种存在方式,一是锁页,二是不锁页,锁页内存存放的内容在任何情况下都不会与主机的虚拟内存进行交换(注:虚拟内...原创 2020-04-04 23:47:37 · 3404 阅读 · 0 评论 -
pytorch 使用GPU
# 查看gpu是否可用,在pytorch中cuda指的就是gpu的相关操作>>> torch.cuda.is_available()True# 获取cuda设备>>> device = torch.device('cuda')>>> devicedevice(type='cuda')# 随机创建一个两行三列的正态分布的tensor...原创 2020-04-04 23:24:21 · 457 阅读 · 0 评论