pytorch 实现 GRL Gradient Reversal Layer_pytorch grl-程序员宅基地

技术标签: 深度学习  pytorch  行人重识别  

在GRL中,要实现的目标是:在前向传导的时候,运算结果不变化,在梯度传导的时候,传递给前面的叶子节点的梯度变为原来的相反方向。举个例子最好说明了:

import torch
from torch.autograd  import  Function

x = torch.tensor([1.,2.,3.],requires_grad=True)
y = torch.tensor([4.,5.,6.],requires_grad=True)

z = torch.pow(x,2) + torch.pow(y,2)
f = z + x + y
s =6* f.sum()

print(s)
s.backward()
print(x)
print(x.grad)

这个程序的运行结果是:

tensor(672., grad_fn=<MulBackward0>)
tensor([1., 2., 3.], requires_grad=True)
tensor([18., 30., 42.])

这个运算过程对于tensor中的每个维度上的运算为:

f(x)=(x^{2}+x)*6

那么对于x的导数为:

\frac{\mathrm{d} f}{\mathrm{d} x} = 12x+6

所以当输入x=[1,2,3]时,对应的梯度为:[18,30,42]

因此这个是正常的梯度求导过程,但是如何进行梯度翻转呢?很简单,看下方的代码:

import torch
from torch.autograd  import  Function

x = torch.tensor([1.,2.,3.],requires_grad=True)
y = torch.tensor([4.,5.,6.],requires_grad=True)

z = torch.pow(x,2) + torch.pow(y,2)
f = z + x + y

class GRL(Function):
    def forward(self,input):
        return input
    def backward(self,grad_output):
        grad_input = grad_output.neg()
        return grad_input


Grl = GRL()

s =6* f.sum()
s = Grl(s)

print(s)
s.backward()
print(x)
print(x.grad)

运行结果为:

tensor(672., grad_fn=<GRL>)
tensor([1., 2., 3.], requires_grad=True)
tensor([-18., -30., -42.])

这个程序相对于上一个程序,只是差在加了一个梯度翻转层:

class GRL(Function):
    def forward(self,input):
        return input
    def backward(self,grad_output):
        grad_input = grad_output.neg()
        return grad_input

这个部分的forward没有进行任何操作,backward里面做了.neg()操作,相当于进行了梯度的翻转。在torch.autograd 中的FUnction 的backward部分,在不做任何操作的情况下,这里的grad_output的默认值是1.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/t20134297/article/details/107870906

智能推荐

eNSP 静态路由记操作演示_ensp吓一跳地址配置-程序员宅基地

文章浏览阅读1.2k次,点赞3次,收藏7次。eNSP 静态路由记操作演示注释:路由:将数据包从一个网络发送到另一个网络的过程工作原理:需要依靠路由表来进行寻址工作的路由表选择最佳路径:指明了:到达每个子网或者是主机应从路由器的哪个物理端口发送,通过此端口 可到达该路径的下一个路由器的地址路由器:只关心网络的状态,决定最佳路径路由表的形成:&直连:通过链路层协议发现的路由直接连接到路由器..._ensp吓一跳地址配置

android旋转spinner方向,android – Spinner下拉列表和屏幕方向更改问题-程序员宅基地

文章浏览阅读319次。我有一个微调器下拉列表和更改方向的问题.在我的活动中,我显示一个对话框,其中有两个微调器.当向用户显示对话框并且用户更改屏幕方向时,一切正常 – 在我的onPause中,我只是简单地关闭对话框.如果用户点击微调器,则在更改方向之前会向用户显示一个下拉列表.但是当用户没有从下拉列表中选择任何内容时,我遇到了一个错误,只是在更改方向之前将列表展开.我已经尝试了很多东西来解决这个问题(即onSaveIn..._android spinner弹出列表旋转

C语言练习题:快递费用计算!!_不足一公斤按一公斤算c语言-程序员宅基地

文章浏览阅读1.2w次,点赞21次,收藏67次。目录_不足一公斤按一公斤算c语言

世界最大花朵时隔20个月再度开花-程序员宅基地

文章浏览阅读1.3k次。2012年11月19日,瑞士巴塞尔,世界最大的花朵巨型魔芋时隔20个月再度开放,此花高2.27米,其块茎重量超过30磅。因开花时会散发出一种类似腐尸的刺鼻气味,因此人们又把它叫做“尸体花”。魔芋花的腐尸气味一般会持续三天左右,人在一千米以外的地方就能闻到,而这种气味会吸引以腐肉为食的甲虫及肉蝇来替它授粉。

如何使用 Navicat 连接数据库?_navicat连接神通数据库-程序员宅基地

文章浏览阅读877次,点赞7次,收藏6次。在Navicat的起始页面,点击”连接”按钮或在顶部菜单栏选择“连接”,然后选择你要连接的数据库类型(例如MySQL、PostgreSQL、SQL Server等)。成功连接后,你将能够查看数据库中的表格和其他对象,并可以执行相应的数据库管理操作。通过以上步骤,你已经成功连接了数据库,可以使用Navicat进行数据库管理和操作。在Navicat主界面选择你刚刚创建的连接,双击该连接或点击“连接”按钮。数据库:连接的数据库名称,如果需要连接特定数据库,请填写该字段。连接名:可任意命名,以方便识别这个连接。_navicat连接神通数据库

mybatis语法入参为Integer和Date类型的问题_mybatis入参为date-程序员宅基地

文章浏览阅读2.6k次。在mybatis中,编写sql语句带判断的情况下&lt;if&gt;标签。许多时候入参都是String的,所以就有很标准的写法。&lt;if test ="a != null and a !=' ' "&gt;执行语句&lt;/if&gt;当传入值的类型不为String类型时,这样写就要有考虑了。上图:java中controller类接收前台传值,有Integer类型传入,可以查..._mybatis入参为date

随便推点

如何压缩pdf文件大小不损失清晰度?pdf压缩文件怎么压缩最小,pdf格式大小怎么压缩?pdf压缩方法_paf不损失压缩-程序员宅基地

文章浏览阅读1k次。搜索一下:~~~~~~轻云pdf编辑压缩官网打开轻云pdf编辑压缩官网,上传pdf文件,上传完毕后网站会自动压缩。当视频压缩的进度条到达100%后就表示视频压缩好了,这个时候回出现预览压缩后的效果选择,大家如果想预览压缩后的视频效果,大家点击预览视频效果按钮就可以了。以上就是我给大家分享的pdf压缩又小又清晰的解决办法了,最大的优势就是操作简单,使用方便,需要压缩pdf的小伙伴们希望能帮到你们。..._paf不损失压缩

Vivado_DDS IP核_设计与仿真_dds vivado-程序员宅基地

文章浏览阅读4.0k次,点赞6次,收藏85次。本文介绍了Vivado中DDS的使用方法,并进行了仿真测试。_dds vivado

荷兰国旗问题(利用基数排序思想实现)_设有一个仅由红、白、蓝种颜色的色块组成的序列,各种色块的个数是随机的,原始排列-程序员宅基地

文章浏览阅读849次。荷兰国旗问题:设有一个仅由红、白、蓝3种颜色的条块组成的条块序列。请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗图案。算法设计利用链式基数排序,将红、白、蓝3种颜色分配到3个链表上,然后对链表进行收集。具体实现typedef enum{Red,White,Blue}Color;typedef struct ListNode{ Color color; struct ListNode *next;}Node,*LinkList;void FlagA_设有一个仅由红、白、蓝种颜色的色块组成的序列,各种色块的个数是随机的,原始排列

大数据基础平台搭建-(四)HBbase集群HA+Zookeeper搭建_大数据平台搭建hadoop hbase-程序员宅基地

文章浏览阅读424次。HBase集群部署采用HA高可用+完全分布式集群方式搭建。_大数据平台搭建hadoop hbase

作差模拟两数相除(29. 两数相除)_作差法能不能用除法-程序员宅基地

文章浏览阅读100次。原题链接:https://leetcode-cn.com/problems/divide-two-integers/题目描述给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例1:输入: dividend = 1_作差法能不能用除法

视觉错觉模型_有才!将立体模型涂改伪装成平面二次元,视觉错觉玩法在日本风靡...-程序员宅基地

文章浏览阅读163次。话说,高达这两个字对于很多80后的朋友来说相信都不会陌生。不论动漫还是模型,这两个字都成为众多男生心目中热血的象征,皆因流传着一句话“机甲才是男人的浪漫”。好比之前上演,比较受欢迎的《头号玩家》,相信当里面的高达角色登场的时候,很多人都会在电影院里“哇”的一声叫出来。一种兴奋,难以压制的热血突然间涌上心头。皆因说高达这两个字眼承载着一代人的回忆也不为过。而在日本的街头上,很多地方都会有象征性的高达..._视觉错觉的涂装

推荐文章

热门文章

相关标签