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

import torch
from torch.autograd  import  Functionx = 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中的每个维度上的运算为:

那么对于x的导数为:

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

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

import torch
from torch.autograd  import  Functionx = 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 + yclass GRL(Function):def forward(self,input):return inputdef backward(self,grad_output):grad_input = grad_output.neg()return grad_inputGrl = 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 inputdef backward(self,grad_output):grad_input = grad_output.neg()return grad_input

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

pytorch 实现 GRL Gradient Reversal Layer相关推荐

  1. 笔记: Gradient Reversal Layer (unsupervised domain adaptation by backpropagation. ICML 2015)

    paper: Ganin, Yaroslav, and Victor Lempitsky. "Unsupervised domain adaptation by backpropagatio ...

  2. pytorch实现梯度反转层(Gradient Reversal Layer)(正确代码)

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  3. PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization

    PyTorch框架学习十八--Layer Normalization.Instance Normalization.Group Normalization 一.为什么要标准化? 二.BN.LN.IN. ...

  4. PyTorch中常用Module和Layer的学习笔记~

    1 前言 今天在学习PyTorch对于VGG网络的官方实现,朱老师在上课的时候也讲了, 不过感觉自己记得还是不是很牢,所以想写个笔记记录一下~ 2 常用Module和Layer nn.Conv2d 这 ...

  5. 0-6岁宝宝发育指导Android

    育儿专家推荐 "0-6岁宝宝发育指导Android"宝宝成长的每个阶段都有具体的发育指标,家长们可以根据这些指标评判自己孩子的发育情况,并做些辅助工作,让宝宝健康成长 应用描述: ...

  6. 域对抗(域适应)训练

    1. 引入 在传统监督学习中,我们经常需要大量带标签的数据进行训练,并且需要保证训练集和测试集中的数据分布相似.如果训练集和测试集的数据具有不同的分布,训练后的分类器在测试集上就没有好的表现.这种情况 ...

  7. [Tensorflow2] 梯度反转层(GRL)与域对抗训练神经网络(DANN)的实现

    文章目录 概述 原理回顾 (可跳过) GRL 层实现 使用 GRL 的域对抗(DANN)模型实现 DANN 的使用案例 !!! 后记 概述 域对抗训练(Domain-Adversarial Train ...

  8. 【深度域适配】一、DANN与梯度反转层(GRL)详解

    CSDN博客原文链接:https://blog.csdn.net/qq_30091945/article/details/104478550 知乎专栏原文链接:https://zhuanlan.zhi ...

  9. 【深度域自适应】一、DANN与梯度反转层(GRL)详解

    前言 在当前人工智能的如火如荼在各行各业得到广泛应用,尤其是人工智能也因此从各个方面影响当前人们的衣食住行等日常生活.这背后的原因都是因为如CNN.RNN.LSTM和GAN等各种深度神经网络的强大性能 ...

最新文章

  1. Oracle 10g 之自动收集统计信息
  2. Linux Sendfile的优势
  3. 僧多粥少?还原 OpenStack 的真实“钱景”
  4. 百练2815:城堡问题(DFS)
  5. Spring/SpringMVC在启动完成后执行方法
  6. Leetcode杯 第三题解答(动态规划)
  7. Camshift算法原理及其Opencv实现
  8. 作业必备:【操作系统实验报告】实验一:熟悉Ubuntu环境(后续会更新~)
  9. 2022李宏毅机器学习hw2
  10. Win10上的dll依赖查看工具Dependencies
  11. 紧急求助SPSS大神。spss在xml神经网络预测值为空是怎么回事?
  12. matlab gmm,GMM聚类及Matlab代码实现
  13. 设为首页和收藏的JS
  14. centos安装git时出错提示make[1]: *** [perl.mak] Error 2
  15. SpyNote的APK无法运行的问题
  16. ios, android平台手机游戏,《王者荣耀》ios和安卓怎么转平台 ios和安卓转平台攻略...
  17. (AAAI-2019)STA:用于大规模基于视频的行人重识别的时空注意力
  18. 无惧管控放开,分享居家办公、远程办公项目经验
  19. Tobii Studio眼动仪教程 - 真正的测谎机器
  20. Python代码实现尼姆游戏聪明模式

热门文章

  1. 1024程序员节|基于Springboot实现爱心捐赠管理系统
  2. 百度、谷歌 高级搜索
  3. Zjh游戏(四)应用层的实现
  4. SNAPSHOT版和正式版
  5. 利用Python实现二维码制作
  6. 代码安全检视方法有_武汉地域SE沙龙第二期——安全代码review方法学习
  7. c语言ofstream,C++ ofstream跟ifstream详细用法以及C语言的file用法
  8. PYTHON FORMAT 简单讲解
  9. DEBUG各命令详细说明
  10. linux命令 怎么模糊查询,linux find命令如何实现模糊查询