pytorch 实现 GRL Gradient Reversal Layer_Tchunren的博客-程序员宅基地_torch 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

智能推荐

Bob库安装_qq_28888837的博客-程序员宅基地

Bob库安装标签: python因为做欺诈检测,有些论文用的是这个库,所以就尝试着装了一下,注意的是这个库要用翻墙才可以,如果校园网的话可以直接使用。它的官网,我参考的是里面安装的这个目录https://www.idiap.ch/software/bob/docs/bob/docs/stable/bob/doc/install.html。其实上面给的比较全,几乎按照上面的方法就行,先创建...

在WINDOWS任务计划程序下执行PHP文件 PHP定时功能的实现_飞鱼计划的博客-程序员宅基地

一、新建两个测试文件demo.php 暂放在程序根目录&amp;lt;?php$fp = @fopen(&quot;test.txt&quot;, &quot;a+&quot;);date_default_timezone_set(PRC);$data = date(&quot;Y-m-d H:i:s&quot;,time()); fwrite($fp , $data. &quot; 让PHP定时运行吧!&amp;lt;br&amp;gt;&quot;);fclose($fp);?&amp;g

Artificial Intelligence for Robotics - SLAM_丁路人的博客-程序员宅基地

Segmented CTE# -----------# User Instructions## Familiarize yourself with the code below. Most of it# reproduces results that you have obtained at some# point in this class. Once you unders...

【leetcode阿里题库】15. 3Sum_AXIMI的博客-程序员宅基地

提交代码class Solution { public List&lt;List&lt;Integer&gt;&gt; threeSum(int[] nums) { List&lt;List&lt;Integer&gt;&gt; ans=new ArrayList&lt;List&lt;Integer&gt;&gt;(); if(nums==null||n...

数学奇思-比例:点:线:面_ESOO的博客-程序员宅基地_奇思数学工具

上次交流米老师留下了一个思考给我们,比例为什么可以用面积表示,体积表示,通过自己查博客,和同学沟通,发现这是数学上一个惯用的思维方式,就是忽略:我们先看一组球,一共100个,其中30个红球,70个黑球,均匀分布在一个平面上:类似如此:我们研究的是红球白球的比例,那么我们忽略球排布的方位,将红球放在一起,黑球放在一起,排列成这样: 我们在数学中,有个概念,点组成线,线组成...

通过fiddler抓取HTTP协议的数据包 | 详细介绍fiddler使用过程。西边人西说测试_西边人细说测试的博客-程序员宅基地_2、尝试写一条规则,查找所有的http协议的数据包。

大多时候,我们使用抓包工具抓取和分析的为HTTP协议,所以,必须要了解HTTP协议。否则抓包工具无从学起。HTTP协议超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。HTTP协议的主要特点可概括如下:1、支持客户/服务器模式。 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。每种方法...

随便推点

对textarea的内容进行详细监听(键盘+鼠标)_sauzny的博客-程序员宅基地

[code=&quot;js&quot;] $(&quot;#textarea&quot;).bind(&quot;propertychange&quot;,function(){...}); $(&quot;#textarea&quot;).bind(&quot;input&quot;,function(){...});[/code]这两个事件必须使用 bind 绑定使用propertychange 是ie事件 就是ie 6 7 8 input 是I...

1-3 IO-BIO和NIO和AIO-Select和epoll多路复用_下次遇见说你好的博客-程序员宅基地_nio aio select epoll

1-3 IO-BIO和NIO和AIO-Select和epoll多路复用1-IO1-1-同步与异步1-2-阻塞和非阻塞2-BIO-NIO-AIO介绍2-1-BIO2-2-NIO2-3-AIO3-Select和epoll多路复用这里是easy的java基础面试下面是总的阅览:java基础java集合JVM多线程mysql_数据库计算机网络nosql_redis设计模式操作系统消息中间件activeMqSSM框架面试题服务中间件Dubbo1-IOIO是什么?输入输出流啊先让我们来

poj 3624 Charm Bracelet(0-1背包~DP~)_zxy_snow的博客-程序员宅基地

0-1背包~~~我是基本原理理解差不多了,就是没自己写过。。。今晚自己写了。写完蛮不自信的,还找代码对了对,居然对着类,哦也~~具体分析详见背包九讲~~~背包啊背包。。。大家天天都背包。。。= =。。。这个题二维的大啊,大致算下,得超内存吧,13000*13000*4/1024 > 65535 。。。今天光棍节,外面有男生在鬼吼 = =。。。真是一群寂寞的人呢。。。呵呵。。我去拿二维写写去。。。#include #include #include #include using namespa

开放架构模块化:基站形态发展必然趋势_yless的博客-程序员宅基地

开放架构模块化:基站形态发展必然趋势http://www.sina.com.cn 2006年09月25日 11:22 中国信息产业网-人民邮电报   从2000年第一代3G基站推出到现在,基站已经发展了五六年时间。3G网络规模的逐步扩大,以及网络部署难度的不断增加,对3G基站提出了高性能、低成本、灵活部署和面向未来的需

天地图简用_qq_33404154的博客-程序员宅基地_天地图setviewport

天地图简单使用天地图优点包括国内卫星图清晰,使用简单,易接入_1671465600

c语言从0开始_7 函数_yl、jc的博客-程序员宅基地

c语言从0开始_7 函数函数函数的分类标准库函数系统函数第三方库函数自定义函数函数声明隐式声明函数定义函数调用函数传参设计函数的准则递归函数是一段具有某项功能的代码,是C语言中管理代码的最小单位,是一个代码模块,命名空间、栈空间是独立的。把代码封装成一个个的函数,可以方便管理和调用代码函数的分类标准库函数C语言标准委员会为C语言以函数形式提供一些基础的功能,被封装在libc.so库,默认添加的,所以使用时需要包含头文件,以函数名(参数) 来调用函数int isalnum(int c);int

推荐文章

热门文章

相关标签