当前位置: 首页 > news >正文

建成区违法建设治理网站广告竞价排名

建成区违法建设治理网站,广告竞价排名,wordpress 加速js插件,男女做那个视频网站免费自拍Triplet Loss的动机 一个好的特征提取器,应该尽可能的做到同类别样本映射出来的特征会聚集在一起,而不同类别的样本映射出来的特征应该要相互远离。 为了达到这个目标,Triplet Loss显式的在Loss里面要求:不同类别之间的距离至少…

Triplet Loss的动机

一个好的特征提取器,应该尽可能的做到同类别样本映射出来的特征会聚集在一起,而不同类别的样本映射出来的特征应该要相互远离。

为了达到这个目标,Triplet Loss显式的在Loss里面要求:不同类别之间的距离至少要超过同类别之间距离的某个阈值。如果能够做到这一点,那么类内距和类间距之间差就有一个明显的鸿沟,那么也可以达到上面提到的目标。

Triplet Loss的定义

Triplet Loss里面包含若干三元组:

  • 锚点 anchor
  • 正例 positive
  • 负例 negative

要求:锚点和正例是处于相同的类别,锚点和负例处于不同的类别。

a,p,n都不是原始样本,而是原始样本被神经网络做特征提取后的得到的特征向量。即:a=f(xa),b=f(xb),c=f(xc)a=f(x_a), b=f(x_b), c=f(x_c)a=f(xa),b=f(xb),c=f(xc)f(⋅)f(·)f()是神经网络特征提取器。

对于一个三元组triplet (a,p,n),它的triplet loss写作:
L=max(d(a,p)−d(a,n)+margin,0)L=max(d(a,p)- d(a,n)+margin, 0)L=max(d(a,p)d(a,n)+margin,0),其中d(x,y)d(x,y)d(x,y) 是自定义的距离函数。

这个东西写的还是很直观的,它想表达的意思为:

  1. 如果 d(a,p)−d(a,n)+margin>0d(a,p)- d(a,n)+margin>0d(a,p)d(a,n)+margin>0,那么loss就是 d(a,p)−d(a,n)+margind(a,p)- d(a,n)+margind(a,p)d(a,n)+margin,否则就是0。0的时候就没有产生实际loss,就不会有梯度,意味着模型无需优化。
  2. d(a,p)−d(a,n)+margin>0d(a,p)- d(a,n)+margin>0d(a,p)d(a,n)+margin>0,有 d(a,n)−d(a,p)<margind(a,n) - d(a,p) < margind(a,n)d(a,p)<margin,此时锚点和负例之间的距离和锚点与正例之间的距离之差还没有超过阈值,于是就要会产生LOSS。
  3. 又因为优化的目标是让loss越小越好,于是模型就会千方百计的优化fff,使得 d(a,p)−d(a,n)+margind(a,p)−d(a,n)+margind(a,p)d(a,n)+margin 越小越好,直到d(a,p)−d(a,n)+margind(a,p)−d(a,n)+margind(a,p)d(a,n)+margin 小于等于0,就不优化了。

Triplet Loss在pytorch里面的实现

__author__ = 'dk'
import torch
import torch as th
from torch.nn import functional as F
from torch import nnclass TripletLoss(nn.Module):"""Triplet loss with hard positive/negative mining.Reference:Hermans et al. In Defense of the Triplet Loss for Person Re-Identification. arXiv:1703.07737.Imported from `<https://github.com/Cysu/open-reid/blob/master/reid/loss/triplet.py>`_.Args:margin (float, optional): margin for triplet. Default is 0.3."""def __init__(self, margin=0.3, batch_size=128, view_num=3):super(TripletLoss, self).__init__()self.margin = marginself.ranking_loss = nn.MarginRankingLoss(margin=margin)def forward(self, inputs,targets = None):"""Args:inputs (torch.Tensor): feature matrix with shape (batch_size, feat_dim).targets (torch.LongTensor): ground truth labels with shape (num_classes)."""if targets == None:targets = self.targetsn = inputs.size(0)# Compute pairwise distance, replace by the official when mergeddist = torch.pow(inputs, 2).sum(dim=1, keepdim=True).expand(n, n)dist = dist + dist.t()dist.addmm_(1, -2, inputs, inputs.t())dist = dist.clamp(min=1e-12).sqrt()  # for numerical stability# For each anchor, find the hardest positive and negativemask = targets.expand(n, n).eq(targets.expand(n, n).t())dist_ap, dist_an = [], []for i in range(n):dist_ap.append(dist[i][mask[i]].max().unsqueeze(0))dist_an.append(dist[i][mask[i] == 0].min().unsqueeze(0))dist_ap = torch.cat(dist_ap)dist_an = torch.cat(dist_an)# Compute ranking hinge lossy = torch.ones_like(dist_an)return self.ranking_loss(dist_an, dist_ap, y)

这是我在网上随便找到的衣服triplet loss实现,这个是基于l2范数实现的,写的比较隐蔽。
这个triplet loss是接受n个样本的特征作为inputs,然后返回最难优化的hard example。

我们解析这几句关键的,为了方便起见,记Inputs为VVV,里面的第i样本为 viv_ivi

        # Compute pairwise distance, replace by the official when mergeddist = torch.pow(inputs, 2).sum(dim=1, keepdim=True).expand(n, n)

计算输入的各个样本自己的l2范数。

        dist = dist + dist.t()

将每个样本自己的l2范数加上别人的l2范数。此时dist是个nxn的矩阵,dist[i,j]表示第i样本与第j样本的l2范数之和,也就是:dist[i,j]=vi2+vj2dist[i,j]=v^2_i + v^2_jdist[i,j]=vi2+vj2

        dist.addmm_(1, -2, inputs, inputs.t())

这个式子展开就是:A=dist−2×VVTA=dist -2 \times VV^TA=dist2×VVT
于是A[i,j]=vi2+vj2−2vivj=(vi−vj)2A[i,j]=v^2_i+v^2_j-2v_iv_j=(v_i-v_j)^2A[i,j]=vi2+vj22vivj=(vivj)2,妙啊。这就是等价于想把每个样本相互减,然后计算差值向量的l2范数。

        dist = dist.clamp(min=1e-12).sqrt()  # for numerical stability

上面这句话就是在开方,这没有啥好说的。

        # For each anchor, find the hardest positive and negativemask = targets.expand(n, n).eq(targets.expand(n, n).t())

上面这句话的作用是:mask[i,j]mask[i,j]mask[i,j]表示i个样本和第j个样本的label是否相同,相同为True,不同为false, 注意这是一个bool的tensor矩阵。

        dist_ap, dist_an = [], []for i in range(n):dist_ap.append(dist[i][mask[i]].max().unsqueeze(0))dist_an.append(dist[i][mask[i] == 0].min().unsqueeze(0))

dist[i][mask[i]] 表示把与第i样本具有相同标签那些样本的dist拿出来,max()是取最大的那个。
dist[i][mask[i] == 0].min()表示把与第i个样本不同标签的样本的dist拿出来,取距离最小的那个。

于是dist_ap保存了那些距离各自锚点最远的同类标签。
dist_an保存距离各自锚点最近的异类标签。这类样本都是难分的。这其实是个hardest triplet loss。

        # Compute ranking hinge lossy = torch.ones_like(dist_an)return self.ranking_loss(dist_an, dist_ap, y)

这个ranking_loss的公式为 loss(x1,x2,y)=max⁡(0,−y∗(x1−x2)+margin)\text{loss}(x1, x2, y) = \max(0, -y * (x1 - x2) + \text{margin})loss(x1,x2,y)=max(0,y(x1x2)+margin)
代入进去就是:loss(dist_an,dist_ap,1)=max⁡(0,dist_ap−dist_an+margin)\text{loss}(dist\_{an}, dist\_{ap}, \bold{1}) = \max(0, dist\_ap-dist\_an + \text{margin})loss(dist_an,dist_ap,1)=max(0,dist_apdist_an+margin)

更通用的实现

那如果我们想实现一个可以选择LpL_pLp 范数也不是硬编码为2范数的triplet loss如何实现呢?

__author__ = 'dk'
import torch
import torch as th
from torch.nn import functional as F
from torch import nnclass TripletLoss(nn.Module):"""Triplet loss with hard positive/negative mining.Reference:Hermans et al. In Defense of the Triplet Loss for Person Re-Identification. arXiv:1703.07737.Imported from `<https://github.com/Cysu/open-reid/blob/master/reid/loss/triplet.py>`_.Args:margin (float, optional): margin for triplet. Default is 0.3."""def __init__(self, margin=0.3, batch_size=128, view_num=3, p=2):super(TripletLoss, self).__init__()self.margin = marginself.p = pself.ranking_loss = nn.MarginRankingLoss(margin=margin)self.targets =  torch.cat([torch.arange(batch_size) for i in range(view_num)], dim=0)def forward(self, inputs,targets = None):"""Args:inputs (torch.Tensor): feature matrix with shape (batch_size, feat_dim).targets (torch.LongTensor): ground truth labels with shape (num_classes)."""if targets == None:targets = self.targetsn = inputs.size(0)# Compute pairwise distance, replace by the official when mergeddist = []for i in range(n):dist.append(inputs[i] - inputs)dist = torch.stack(dist)dist = torch.linalg.norm(dist,ord=self.p,dim=2)# For each anchor, find the hardest positive and negativemask = targets.expand(n, n).eq(targets.expand(n, n).t())dist_ap, dist_an = [], []for i in range(n):dist_ap.append(dist[i][mask[i]].max().unsqueeze(0))dist_an.append(dist[i][mask[i] == 0].min().unsqueeze(0))dist_ap = torch.cat(dist_ap)dist_an = torch.cat(dist_an)# Compute ranking hinge lossy = torch.ones_like(dist_an)return self.ranking_loss(dist_an, dist_ap, y)

两种方法用时测试:


if __name__ == '__main__':import time,tqdminputs = torch.randn(128,256)step = 1000tripletloss1 = TripletLoss(batch_size=64,view_num=2)loss1 = 0from SSL.triplet_loss import TripletLoss as TripletLoss2tripletloss2 = TripletLoss2(batch_size=64,view_num=2)loss2 = 0s = time.time()for i in tqdm.trange(step):loss1 += tripletloss1(inputs)e1=time.time()for i in tqdm.trange(step):loss2 += tripletloss2(inputs)e2 =time.time()print('1: {0}s, result:{1}'.format(e1-s, loss1/ step))print('1: {0}s, result:{1}'.format(e2-e1, loss2/ step))

tripletloss1就是网上的方法,tripletloss2是我们实现的。结果:

方法1: 52.5317645072937s, result:2.367180824279785
方法2: 15.61170482635498s, result:2.367180824279785

可以发现我们的方法更快,究其原因,方法1里面矩阵的乘法及其耗时。

http://www.lbrq.cn/news/2683585.html

相关文章:

  • 黄岩区住房保障建设局网站武汉百度推广多少钱
  • 百度做网站的公司个人网站注册平台
  • 网站正在建设中模板免费下载网站制作策划
  • 企业网站的建立如何带来询盘外贸怎么找客户资源
  • 做日本民宿的网站抖音账号权重查询
  • 免费建立网站教程如何网络媒体推广
  • 哪些网站容易收录seo是什么姓氏
  • 织梦做的网站被黑了seo排名优化方式方法
  • 网站返回首页怎么做的好看今日新闻热点10条
  • 政府网站设计方案企业网站模板源码
  • 海南海口网站建设网络广告营销的案例
  • 郑州做网站软件百家号查询排名数据查询
  • 临朐县网站建设阿里云域名注册查询
  • 网站建设合伙合同今日足球赛事推荐
  • 网站建设51cto微信公众号的推广
  • 校园网站建设与应用星链友店
  • 西青网站建设百度问答平台入口
  • 合肥哪里有做网站浙江网站建设制作
  • cnd设计网官网重庆网站优化软件
  • 新闻资讯网站模板百度推广一般要多少钱
  • 百度网站开发业务石家庄百度搜索优化
  • 在哪个网站去租地方做收废站seo网络推广是干嘛的
  • 自己的网站到期域名如何续费跨境电商平台哪个最好最可靠
  • 建筑网站大全免费如何推广品牌
  • 重庆产品网站推广百度竞价排名利弊
  • 通州个人做网站苹果cms永久免费建站程序
  • 企事业网站建设网站开发需要的技术
  • wordpress 吐槽插件网站优化排名工具
  • 怎样学习做网站的编程seo长尾关键词优化
  • 某网站做参考文献的书写搜索引擎优化实训报告
  • Python Day28 HTML 与 CSS 核心知识点 及例题分析
  • 记录docker使用kong consul postgresql配置dns异常解决
  • MySQL 函数
  • 每日任务day0810:小小勇者成长记之武器精炼
  • Linux 路由子系统深度分析:框架、实现与代码路径
  • 通用AGI到来,记忆仍需要一点旧颜色