序列化推荐中的GRU与Transformer源码解析之一
GRU4Rec源码(TF版本):github.com/Songweiping/...
Transformer源码:github.com/kang/SASR...
序列化推荐领域中,GRU4Rec成功地将循环神经网络(NLP和时序预测常用)应用至推荐领域,源码源码此模型取得了良好效果。损失损失紧随其后的函数函数是"SASR",基于注意力机制的源码源码医院crm系统源码自适应序列推荐模型,实验表明其性能超越了GRU4Rec。损失损失
两篇论文的函数函数作者均在源码公开阶段,为研究者提供参考。源码源码我们深入剖析源码,损失损失后续系列文章将比较GRU4Rec与SASR的函数函数差异、联系与优缺点。源码源码
GRU4Rec模型结构简洁,损失损失采用门限循环神经网络,函数函数Embedding层处理item_id的源码源码one_hot编码,降低维度,便于优化。
并行化训练数据集优化了模型训练速度,构建了training_batch,便于使用GPU加速矩阵运算。
负采样技术提高了训练频率,利用同一时刻不同session中的item作为负样本。
模型设计了贝叶斯排序和TOP1等pairwise方法计算排序损失,认为pairwise结果优于pointwise。
实验数据集包括RSC和私有VIDEO集,结果表明GRU4Rec模型性能优秀,测试集评价指标包括召回率(recall)和倒序排名得分(mrr)。
深入分析模型的Tensorflow版本代码,主要从main.py和model.py文件开始,重点解析模型定义、损失函数、GRU4Rec核心代码、数据集初始化、模型训练与预测以及评估函数。
GRU4Rec的代码分析暂告一段落,后续将详细梳理SASR代码,目标是通过三篇文章全面探讨两个模型的细节。感谢关注。
ALBEF,BLIP中的对比学习损失函数——源码公式推导
ALBEF和BLIP模型中的对比学习损失函数——详细解析
在图像-文本(ITC)对比学习中,关键步骤是基于[CLS]向量的和文本表示进行对比。和文本的全局表示分别用[公式]和[公式]表示,动量编码器的输出通过[公式]和[公式]反映。首先,通过动量编码器处理和文本,将得到的[CLS]置入对应队列头部,接着计算编码器与动量编码器输出的rps 指标源码相似度,如[公式]和[公式]所示。
硬标签的制作部分,通过[公式]生成每对图-文的标签,表示它们的关系。原始标签队列与生成的硬标签进行拼接,形成新的对比矩阵。动量蒸馏引入后,计算动量编码器输出与队列的相似度,并生成软标签,如[公式]和[公式]所示。
对比学习ITC损失计算基于交叉熵,通过[公式]变形,考虑了动量蒸馏的情况。不蒸馏时,损失函数可以表示为[公式],而带动量蒸馏的MLM损失则为[公式],通过KL散度的近似公式简化计算,最终得到的源代码计算公式为[公式]。
ITM头的运用则是在每个样本的全局表示上进行分类,通过[公式]计算ITM损失。至于MLM损失,通过掩码处理文本并生成标签,计算方式基于[公式],并在动量蒸馏下调整为[公式]。
模型的配置调整可以通过改变num_hidden_layers参数来完成,如在Huggingface的bert-base-uncased模型中。总的来说,ALBEF和BLIP的损失函数设计注重了全局表示的对比和样本关系的精细处理,通过动量蒸馏优化了模型的训练效果。
FCOS:论文与源码解读
FCOS:全称为全卷积单阶段目标检测,它在锚框自由领域中占有重要地位,与RetinaNet在锚框基础领域中地位相似。它沿用ResNet+FPN架构,通过实验证明,在相同backbone和neck层下,锚框自由方法可以取得比锚框基础方法更好的效果。 FCOS借鉴了语义分割的思想,成功地去除了锚框先验,实现了逐点的目标检测,是全卷积网在目标检测领域的延伸。代码比锚框基础类简单,非常适合入门。1. 动机
锚框基础类目标检测方法存在多处缺点,FCOS通过去除锚框,提出了简单、温柔且有力的源码娃娃机目标检测模型。2. 创新点
FCOS借鉴了语义分割的思想,实现了去除锚框、逐点的目标检测。以年提出的全卷积网(FCN)为例,FCOS借鉴了FCN的思想,将其应用于目标检测,主要步骤包括生成先验、分配正负样本和设计bbox assigner。3. 模型整体结构与流程
训练时,包括生成先验和正负样本分配。FCOS的先验是将特征图上的每一点映射回原始图像,形成逐点对应关系。分配正负样本时,正样本表示预测目标,负样本表示背景。3.1 训练时
在训练阶段,先通过prior generate生成先验,然后进行bbox assign。在分配过程中,FCOS利用了FPN层解决ambigous点的问题,通过多尺度特征融合和逐层分配目标来解决。3.1.1 prior generate
FCOS通过映射特征图上的每一点回原始图像,形成点对点对应关系,生成先验。通过公式计算映射关系,其中s表示步长。3.1.2 bbox assigne
分配正负样本时,FCOS借鉴了anchor base方法的正负样本分配机制,通过设计bbox assigner解决ambigous点问题。分配流程包括计算输出值、对输出进行exp操作和引入可学习参数scale,以及使用FPN层分而治之,进一步解决ambigous问题。3.1.3 centerness
FCOS额外预测了centerness分支,以过滤远离目标中心的点,提高检测质量。centerness值范围为0~1,越靠近中心,值越大。测试时,最终score=cls_score*centerness。3.1.4 loss
损失函数包括focal loss、IoU loss和交叉熵损失,用于训练分类、定位和centerness分支。3.2 模型结构
模型继续沿用ResNet和FPN层,棕色公式源码进行公平比较。FPN输出的特征层与RetinaNet类似,但FCOS在FPN输出的最后一层特征层上进行额外卷积,与RetinaNet在输入特征层上进行额外卷积不同。在推理阶段,注意centerness与分类分数的乘积作为最终得分,且需要进行NMS操作。4. 总结与未来方向
FCOS是一个简单、温柔、有力量的锚框自由方法,地位重要,思想借鉴于语义分割,流程类似传统目标检测,包括生成先验、正负样本匹配、bbox编码和NMS等,额外加入centerness分支以提升检测质量。 未来,FCOS的研究方向可能包括更深入的理论分析、模型优化和跨领域应用探索。5. 源码
mmdetection提供了FCOS的配置文件和代码实现,包括多个版本和改进。了解这些细节有助于深入理解FCOS的实现和优化策略。Python实现岭回归(Ridge Regression)
项目专栏: Python实现经典机器学习算法附代码+原理介绍
前言
我的项目环境:
项目专栏: Python实现经典机器学习算法附代码+原理介绍
一、基于原生Python实现岭回归(Ridge Regression)
岭回归(Ridge Regression)是一种常见的线性回归的扩展形式,它通过引入 L2正则化项 来解决线性回归模型中可能存在的过拟合问题。
线性回归模型的预测函数为:
其中,[公式]是预测值,[公式]是特征值,[公式]是模型参数。
线性回归模型的损失函数是平方损失函数:
其中,[公式]是样本数量,[公式]是第[公式]个样本的真实标签值,[公式]是第[公式]个样本的预测标签值。
当特征数量[公式]很大时,线性回归模型可能会出现过拟合的现象,即模型在训练数据上表现良好,但在测试数据上表现较差。为了解决过拟合问题,我们可以通过引入正则化项来限制模型参数的取值范围,从而使模型更加稳定。
岭回归通过引入L2正则化项来限制模型参数的取值范围,其损失函数为:
其中,[公式]是正则化系数,用来控制正则化的强度。[公式]是编译net源码L2正则化项,用来限制模型参数的取值范围。
岭回归的优化目标是最小化损失函数,即:
岭回归的参数可以通过解析解 或 迭代优化方法(如梯度下降) 来得到。
本篇文章我们采用Python语言实现经典的机器学习算法Ridge Regression 。
二、正则化项介绍
在机器学习中,正则化(Regularization)是一种常用的技术,它通过在目标函数中增加一个 惩罚项 来控制模型的复杂度,从而防止过拟合问题的出现。
正则化项通常添加在模型的损失函数(目标函数)中,它的一般形式如下:
其中,L(w)是损失函数,y是实际标签值,f(x; w)是模型的预测值,w是模型的参数,λ是正则化系数,R(w)是正则化项。
正则化项R(w)可以有多种形式,常见的有L1正则化 和 L2正则化 两种。
L1正则化的作用是使部分系数变为0,从而实现特征选择和降维。
L2正则化的作用是使系数向量w的每个分量都尽可能小,从而防止过拟合问题的出现。
正则化项的正则化系数λ 可以通过交叉验证等方法来确定,通常取值范围为 0到1 之间的实数,数值越大,正则化项的惩罚力度越强,模型越倾向于选择较小的系数。
三、岭回归的算法原理
岭回归的算法原理可以分为两步:参数估计和预测。
在预测时,我们可以使用模型得到的参数[公式]来预测新的样本的标签值。需要注意的是,在预测时,我们需要对新样本的特征值进行标准化处理,使其和训练集的特征值处于同样的尺度范围。
以上就是岭回归的算法原理,需要注意的是,在实际应用中,我们需要对正则化系数进行调参,以达到最优的模型效果。常用的调参方法有网格搜索和交叉验证等。
四、算法实现
本部分将讲解如何使用原生Python来实现Ridge回归,本文并没有直接使用sklearn 中的 Ridge,而是利用纯Python实现一个效果一致的Ridge Regression,因为这样才能够帮新手小白理解算法内部的具体流程。
3.1 导包
对于本项目主要使用到的第三方库有以下几种,都是比较常见的
3.2 搭建岭回归算法
以下代码实现了岭回归模型,通过自己实现的方法和sklearn库中的Ridge模型进行比较。
3.2.1 初始化模型参数
在下面搭建的RidgeRegression类中,__init__ 方法是类的初始化方法,主要用于初始化RidgeRegression类的参数。该方法的输入参数如下:
3.2.2 模型训练
LassoRegression类的fit 方法用于训练 岭回归 模型,其主要功能是根据输入的特征矩阵 X 和标签 y 来更新模型的系数 self.coef_ 和 self.intercept_。
注:这里为什么没有使用梯度下降法来迭代更新参数呢?
岭回归的参数更新是通过解析解得到的,而不是通过梯度下降。这是因为岭回归的损失函数是一个带有L2正则化项的二次函数,它的解析解可以直接通过求导和矩阵运算得到。使用解析解可以避免梯度下降所带来的局部最优问题,同时也可以提高算法的计算效率。
具体来说,岭回归的损失函数为:
其中,[公式]是[公式]的设计矩阵,[公式]是[公式]的参数向量,[公式]是[公式]的目标向量,[公式]是正则化系数。
对损失函数求导,得到最优参数[公式]的解析解:
其中,[公式]是[公式]的单位矩阵。
因此,岭回归可以直接通过矩阵运算计算最优参数[公式],而不需要使用梯度下降。
3.2.3 模型预测
RidgeRegression类的predict 方法用于使用训练好的Ridge回归模型进行预测,其主要功能是根据输入的特征矩阵 X 来预测相应的标签值。
3.2.4 完整岭回归模型
完整的岭回归模型定义如下:
3.3 定义数据
为了测试模型,我们使用了如下代码来生成回归的数据集,该代码用于生成一个具有线性关系的数据集,其中:
函数的返回值X 和 y 分别表示生成的数据集的特征矩阵和响应变量向量。生成的数据集包含了一个线性关系,其中特征矩阵X和响应变量y之间的关系为 y = Xw + b + e,其中 w 是一个真实的权重向量,b 是一个常数偏置项,e 是一个高斯噪声项。
3.4 对比自实现模型与官方Ridge模型效果
然后我们使用如下代码通过自己实现的方法和sklearn 库中的Ridge模型进行比较。
效果如下:
可以看到,自己实现的Ridge回归模型和sklearn的Ridge回归模型的参数和均方误差非常接近,证明了自己实现的Ridge回归模型的正确性和有效性。
3.6 测试模型
通过如下代码,我们可以查看Ridge模型预测值与真实值之间的MSE 和 R2 等指标,查看模型训练的效果如何。
模型的测试结果如下:
3.7 可视化结果
为了查看效果可以用matplotlib 库将真实数据和预测结果可视化:
上图蓝色曲线为自实现Ridge模型的预测结果,橙色曲线为sklearn中的Ridge模型的预测结果,绿色曲线未真实标签。可以看到,预测结果和真实值基本吻合,证明了RidgeRegression模型的有效性。
完整源码
MaskFormer源码解析
整个代码结构基于detectron2框架,代码逻辑清晰,从配置文件中读取相关变量,无需过多关注注册指令,核心在于作者如何实现网络结构图中的关键组件。MaskFormer模型由backbone、sem_seg_head和criterion构成,backbone负责特征提取,sem_seg_head整合其他部分,criterion用于计算损失。
在backbone部分,作者使用了resnet和swin两种网络,关注输出特征的键值,如'res2'、'res3'等。在MaskFormerHead中,核心在于提供Decoder功能,这个部分直接映射到模型的解码过程,通过layers()函数实现。
pixel_decoder部分由配置文件指定,指向mask_former/heads/pixel_decoder.py文件中的TransformerEncoderPixelDecoder类,这个类负责将backbone提取的特征与Transformer结合,实现解码过程。predictor部分则是基于TransformerPredictor类,负责最终的预测输出。
模型细节中,TransformerEncoderPixelDecoder将backbone特征与Transformer结合,生成mask_features。TransformerEncoderPixelDecoder返回的参数是FPN结果与Transformer编码结果,后者通过TransformerEncoder实现,关注维度调整以适应Transformer计算需求。predictor提供最终输出,通过Transformer结构实现类别预测与mask生成。
损失函数计算部分采用匈牙利算法匹配查询和目标,实现类别损失和mask损失的计算,包括dice loss、focal loss等。整个模型结构和输出逻辑清晰,前向运算输出通过特定函数实现。
总的来说,MaskFormer模型通过backbone提取特征,通过Transformer实现解码和预测,损失函数计算统一了语义分割和实例分割任务,实现了一种有效的方法。理解代码的关键在于关注核心组件的功能实现和参数配置,以及损失函数的设计思路。强烈建议阅读原论文以获取更深入的理解。
PyTorch 源码分析(一):torch.nn.Module
nn.Module是PyTorch中最核心和基础的结构,它是操作符/损失函数的基类,同时也是组成各种网络结构的基类(实际上是由多个module组合而成的一个module)。
在Python侧,2.1回调函数注册,2.2 module类定义中,有以下几个重点函数:
重点函数一:将模型的参数移动到CUDA上,内部会遍历其子module。
重点函数二:将模型的参数移动到CPU上,内部会遍历其子module。
重点函数三:将模型的参数转化为fp或者fp等,内部会遍历其子module。
重点函数四:forward函数调用。
重点函数五:返回该net的所有layer。
在类图中,PyTorch的算子都是module的子类,包括自定义算子和整网定义。
在C++侧,3.1 module.to("cuda")详细分析中,本质是将module的parameter&buffer等tensor移动到CUDA上,最终调用的是tensor.to(cuda)。
3.2 module.load/save逻辑中,PyTorch模型保存分为两种,一种是纯参数,一种是带模型结构(PyTorch中的模型结构,本质上是由module、sub-module构造的一个计算图)。
parameter、buffer是通过key-value的形式来存储和检索的,key为module的.name,value为存储具体数据的tensor。
InputArchive/OutputArchive的write和read逻辑。
通过Module,PyTorch将op/loss/opt等串联起来,类似于一个计算图。基于PyTorch构建的ResNet等模型,是逐个算子进行计算的,tensor在CPU和GPU之间来回流动,而不是整个计算都在GPU上完成(即中间计算结果不出GPU)。实际上,在进行推理时,可以构建一个计算图,让整个计算图的计算都在GPU上完成,不知道是否可行(如果GPU上有一个CPU就可以完成这个操作,不知道tensorrt是否是这样的操作)。
U-Net代码解读python[每周一篇]Week1-U-Net
本文提供Python版本的U-Net代码解读,内容覆盖数据加载、模型架构、训练及结果展示。源码及数据集可在线获取,详细步骤如下:
1. 数据集加载:`dataset.py`文件负责数据读取与预处理,确保输入数据符合模型需求。
2. U-Net模块定义:`unet_parts.py`中定义U-Net结构中的关键组件,包括卷积层、下采样层、上采样层和连接层,实现特征提取与语义分割。
3. U-Net模型构建:`unet_model.py`整合各部分,构建完整的U-Net模型,实现图像分割任务。
4. 模型训练:`train.py`脚本用于训练U-Net模型,设置超参数、损失函数、优化器等,以优化模型性能。
5. 结果展示:`resultshow.py`展示训练效果,包括分割结果可视化等。
源码链接:LYK/U-Net-Week1-(github.com)
训练流程及结果可参照:Pytorch深度学习实战教程(三):UNet模型训练,深度解析!-腾讯云开发者社区-腾讯云 (tencent.com)
通过以上步骤,开发者能够深入理解U-Net在生物医学图像分割领域的应用,掌握其代码实现与训练技巧。
DETR解读
DETR(Detection Transformer)是一种新型的目标检测模型,它基于Transformer架构,由Facebook AI Research(FAIR)提出。DETR与传统目标检测方法不同,不使用锚框或候选区域,而是直接将整个图像输入到Transformer中,同时输出目标的类别和边界框。
DETR的主要构成部分包括backbone、transfomer以及head模块。本文将结合源码对DETR进行解析。
Backbone部分包含PE(position embedding)和cnn(resnet)主干网络。
PE采用二维位置编码,x和y方向各自计算了一个位置编码,每个维度的位置编码长度为num_pos_feats(该数值实际上为hidden_dim的一半),奇数位置正弦,偶数位置余弦,最后cat到一起(NHWD),permute成(NDHW)。输入的mask是2**,那么最后输出的pos encoding的shape是2***。
CNN_backbone采用resnet,以输入3**为例,输出**,下采样5次合计倍。
Transfomer主要由encoder和decoder两大模块构成。
TransformerEncoder中,qkv都来自src,其中q和k加了位置编码,v没有加,猜测原因可能是qk之间会计算attention,所以位置是比较重要的,value则是和attention相乘,不需要额外的位置编码。
TransformerDecoder中,几个重点的变量包括object query的自注意力和cross attention。
Head部分,分类分支是Linear层,回归分支是多层感知机。
Matcher采用的是HungarianMatcher匹配,这里计算的cost不参与反向传播。
Criterion根据匈牙利算法返回的indices tuple,包含了src和target的index,计算损失:分类loss+box loss。
分类损失采用交叉熵损失函数,回归损失采用L1 loss + Giou loss。
推理部分,先看detr forward函数,后处理,预测只需要卡个阈值即可。
论文链接:arxiv.org/pdf/....
代码链接:github.com/facebookrese...
参考链接:zhuanlan.zhihu.com/p/... zhuanlan.zhihu.com/p/...
如需删除侵权内容,请联系我。
2024-11-30 08:48
2024-11-30 08:46
2024-11-30 08:38
2024-11-30 07:47
2024-11-30 07:35