![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
pytorch
通过简单的分类,序列标注,seq2seq任务来深入学习pytorch框架,包括数据的加载,模型的构建,模型的训练,学习各种优化算法以及正则化策略在pytorch中是如何实现的
旺旺棒棒冰
做正确的事,正确得做事
展开
-
pytorch梯度累积
增大batchsize训练模型,一般都能带来一定的提升。在显卡内存不够的情况下,可以通过梯度累积的方式,来扩大batchsize。因为pytorch中,反向传播之后,梯度是不清零的,因此要实现梯度累积,比较简单不使用梯度累积的情况下,训练代码:for i, (input_id, label) in enumerate(train_loader): # 1. 模型输出 pred = model(input_id) loss = criterion(pred, labe原创 2022-03-21 11:06:49 · 5033 阅读 · 0 评论 -
torch.index_select与torch.gather
torch.index_selectindex_select 只能处理两维矩阵,指定行或者列的索引,按行或者按列取出# indices 只能是一维x = torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8], [2, 2, 3, 4]])print(x)indices = torch.tensor([0, 2])print(torch.index_select(x, 0, indices))# 按行取print(torch.index_select(x,翻译 2022-01-19 10:02:18 · 568 阅读 · 0 评论 -
pytorch中获取模型参数
原文链接:pytorch中获取模型参数:state_dict和parameters两个方法的差异比较_造未来-CSDN博客一、本文的模型案例代码如下:import torchimport torch.nn.functional as Ffrom torch.optim import SGD class MyNet(torch.nn.Module): def __init__(self): super(MyNet, self).__init__() # ..转载 2021-11-19 14:31:59 · 8180 阅读 · 0 评论 -
pytorch之expand和repeat
1. expand没有重新分配内存,只是原有数据的引用import torchx = torch.tensor([[1], [2], [3]])x.size()x.expand(3, 4)new_x = x.expand(-1, 4) # -1 means not changing the size of that dimensionprint(x)print(new_x)x[0][0] = 15print(x)print(new_x)输出:tensor(..翻译 2021-10-22 20:16:10 · 402 阅读 · 1 评论 -
pytorch按照索引取batch中的数
比如说bert的输出表征是基于子词的,想要用于基于词的任务,需要将词对应的最后一个子词的表征取出来,代码如下:import torchimport torch.nn as nntorch.manual_seed(1)mix = torch.randn([2, 5, 3])range_vector = torch.tensor([[0], [1]])offsets2d = torch.tensor([[1, 3, 0], [1, 2, 4]])print(mix)selected_原创 2021-10-22 19:49:50 · 2047 阅读 · 0 评论 -
pytorch之BatchNorm
为了解决 Internal Covariate Shift问题引入,该问题具体表现为:中间层输入分布总是变化,增加了模型拟合的难度。中间层输入分布会使输出逐渐靠近激活函数梯度较小的地方,导致梯度消失BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的,训练过程中,在输入到激活函数之前,对每个batch输入,做如下处理:在训练过程中,通过以上处理,使得每个batch保持相同分布;如下图所示,训练过程为第1-6行,这里需要注意的是BN层是引入了可训练参数的β\be原创 2021-08-23 17:01:17 · 8575 阅读 · 1 评论 -
激活函数总结
identityf(x)=xf(x) = xf(x)=xlogisticf(x)=11+exp(−x)f(x) = \frac 1{ 1 + exp(-x)}f(x)=1+exp(−x)1tanhf(x)=tanh(x)f(x) = tanh(x)f(x)=tanh(x)reluf(x)=max(0,x)f(x) = max(0, x)f(x)=max(0,x)原创 2021-07-29 17:31:55 · 70 阅读 · 0 评论 -
loss函数之MarginRankingLoss
MarginRankingLoss排序损失函数对于包含NNN个样本的batch数据 D(x1,x2,y)D(x1,x2,y)D(x1,x2,y), x1x1x1, x2x2x2是给定的待排序的两个输入,yyy代表真实的标签,属于{1,−1}\{1,-1\}{1,−1}。当y=1y=1y=1是,x1x1x1应该排在x2x2x2之前,y=−1y=-1y=−1是,x1x1x1应该排在x2x2x2之后。第nnn个样本对应的losslossloss计算如下:ln=max(0,−y∗(x1−x2)+margin原创 2021-07-12 17:29:20 · 10665 阅读 · 2 评论 -
BCELoss忽视某个类别
loss_fct = BCEWithLogitsLoss(reduction="none") tmp_mask = (labels != -100) # 对类标为-100的不计算loss,例如padding位置 tmp_loss = loss_fct(prediction_scores.squeeze(-1), labels.float()) masked_lm_loss = torch.mean(tmp_loss * tmp_mask)原创 2021-06-11 16:00:01 · 640 阅读 · 1 评论 -
pytorch中的乘法操作
矩阵相乘三维tensor相乘,第一个维度相同(batch),后两个维度的矩阵分别相乘input = torch.tensor([[[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], [[4, 4, 4, 4], [5, 5, 5, 5], [原创 2021-05-30 00:16:40 · 1460 阅读 · 0 评论 -
深度学习模型的集成
目前,了解到的深度学习模型集成的方法主要有两种:第一:平均checkpoints即对存储好的多个checkpoint中的参数求平均,然后重新保存。这里的多个checkpoint可以是同一份数据训练,模型收敛后存储的多个模型;也可以是不同的数据训练得到的模型。该方法的优点是可以提高单个模型的效果,并且推理的速度和存储都不会发生变化。缺点在于待平均的模型的结构要完全一致,另外提升的效果不会很大。以pytorch为例,代码如下:# Copyright 2018 CVTE . All Rights Rese原创 2021-05-25 19:36:56 · 2319 阅读 · 1 评论 -
pytorch之参数的初始化
w = torch.empty(3, 5)nn.init.normal_(w,0,1)w = torch.empty(3, 5)nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')w = torch.empty(3, 5)nn.init.uniform_(w)翻译 2021-05-23 16:26:18 · 714 阅读 · 0 评论 -
pytorch常见问题之cpu占满
问题:在服务器上跑pytorch服务,cpu核心全部占用,影响其他服务的性能解决方法:pytorch默认是能用多少线程就用多少的,可通过一下方法设置线程修改环境变量export OMP_NUM_THREADS=1在代码里面设置线程数torch.set_num_threads(int thread) 通过减少线程数,可以减少cpu占用,同时也会使得服务的qps有所下降...转载 2021-05-12 12:54:10 · 3214 阅读 · 0 评论 -
pytorch之学习率变化策略之MultiplicativeLR
MultiplicativeLRtorch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)设置学习率为上一次的学习率乘以给定lr_lambda函数的值new_lr = lr_lambda(self.last_epoch) * last_lrlast_lr 最开始为base_lroptimizer:优化器lr_lambda:函数或者函数列表last_epoch:默认原创 2021-05-11 19:47:12 · 465 阅读 · 0 评论 -
pytorch显存管理
PyTorch使用缓存分配器来加速内存分配。允许在不进行设备同步的情况下快速重新分配内存。缓存分配器中未被占用得内存,用nvidia-smi查看也显示为使用torch.cuda.empty_cache()释放缓存分配器中未被占用得显存(减少显存碎片),从而可被其他gpu服务使用,也可使用nvidia-smi命令查看现象:在部署gpu服务后,由于每次得请求数据大小不一致,随着请求数据变大(例如,文本长度变长,batchsize变大),gpu服务的缓存会越来越大。可使用torch.cuda.empty翻译 2021-05-11 13:19:02 · 5612 阅读 · 0 评论 -
查看显卡型号
nvidia-smi -LGPU 0: GeForce GTX 1080 Ti (UUID: GPU-605d2ec6-45f8-114b-3cc6-a7979cdc6a72)GPU 1: GeForce GTX 1080 Ti (UUID: GPU-54ea13f7-27d8-c1e4-4b86-9411e1283dff)GPU 2: GeForce GTX 1080 Ti (UUID: GPU-13164ab2-388d-833b-a7a0-dc6bca2a8635)三张显卡,型号是 Ge原创 2021-05-11 11:43:31 · 972 阅读 · 0 评论 -
pytorch之学习率变化策略之LambdaLR
根据当前epoch来调整学习率 torch.optim.lr_scheduler根据验证集的测试指标调整学习率torch.optim.lr_scheduler.ReduceLROnPlateau学习率调整一般在参数更新之后原创 2021-05-10 13:22:52 · 15020 阅读 · 7 评论 -
pytorch之model.zero_grad() 与 optimizer.zero_grad()
1. 引言在PyTorch中,对模型参数的梯度置0时通常使用两种方式:model.zero_grad()和optimizer.zero_grad()。二者在训练代码都很常见,那么二者的区别在哪里呢?2. model.zero_grad()model.zero_grad()的作用是将所有模型参数的梯度置为0。其源码如下:for p in self.parameters(): if p.grad is not None: p.grad.detach_() p.gr转载 2021-05-10 11:05:25 · 7244 阅读 · 0 评论 -
pytorch tensor操作:tensor与numpy转换
tensor转numpyt = torch.ones(5)print(f"t: {t}")n = t.numpy()print(f"n: {n}")输出:t: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)n: [2. 2. 2. 2. 2.]cpu上的tensor可以和numpy array共享内存地址,改变其中的一个另一个也会改变t.add_(1)print(f"t: {t}")print(f"n: {n}")输出:t:翻译 2021-05-08 11:20:16 · 1353 阅读 · 0 评论 -
pytorch数据读取之Dataset与DataLoader
1. 先前处理数据集的代码经常比较混乱并且难以维护2. 数据集处理代码应该和训练代码解耦合,从而达到模块化和更好的可读性因此,pytorch提出了两个数据处理类:DataLoader与Datasetfrom torch.utils.data import Dataset, DataLoaderclass SimpleDataset(Dataset): def __init__(self, size): self.x = [i for i in range...原创 2021-04-29 13:25:15 · 860 阅读 · 0 评论 -
pytorch中mask操作之torch.masked_select
import torch# torch.masked_select(input, mask, *, out=None) → Tensor# 返回input中mask为True的元素,组成1维tensor# input 和mask的维度不一定要相同,但是需要可以扩展成同样维度x = torch.randn(3, 4)print(x)"""tensor([[ 0.3552, -2.3825, -0.8297, 0.3477], [-1.2035, 1.2252, 0.5.原创 2021-04-28 16:39:24 · 7302 阅读 · 0 评论 -
pytorch之tensor操作expand
import torch# expand 将tensor按照某一个维度扩大或者将tensor整体扩大# expand 不会额外分配空间,只是原tensor的一个视图x = torch.tensor([[1], [2], [3]])print(x.size())"""torch.Size([3, 1])"""y = x.expand(3, 4)print(y)"""tensor([[ 1, 1, 1, 1], [ 2, 2, 2, 2], .原创 2021-04-28 10:56:44 · 1256 阅读 · 0 评论 -
2021-04-23
from __future__ import print_functionfrom __future__ import divisionfrom __future__ import absolute_importimport torchprediction_scores = torch.randn([3, 4, 5])labels = torch.ones([3, 4]) * (-100)labels[0][1] = 2labels[1][2] = 1labels[2][3] = 3.原创 2021-04-23 14:40:56 · 66 阅读 · 0 评论