一 总体介绍

DANN是一种迁移学习方法,是对抗迁移学习方法的代表方法。基本结构由特征提取层f,分类器部分c和对抗部分d组成,其中f和c其实就是一个标准的分类模型,通过GAN(生成对抗网络)得到迁移对抗模型的灵感。但此时生成的不是假样本,而是假特征,一个足以让目标域和源域区分不开的假特征。

而领域判别器D其实是个标准的二分类分类器,0是源域,1是目标域。它本身的目标是区分源域和目标域,而我们想要的结果是使判别器越来越分不出数据特征来自源域还是目标域,感觉起来这很矛盾。但其实我们引入一个梯度反转层就可以完美避免这个问题。

引入梯度反转层(GRL),分类器c和判别器d朝着优化分类器效果的方向反向传播优化梯度。有了梯度反转层,简单的说就是判别器d反向传播时,梯度更新前引入了一个“ - ”。这样就可以同时满足判别器和我们需求的一致性。

下面是DANN的基本网络图。


二 UDTL代码库中的DANN网络

对抗网络部分代码。

from torch import nn
import numpy as npdef calc_coeff(iter_num, high=1.0, low=0.0, alpha=10.0, max_iter=10000.0):return np.float(2.0 * (high - low) / (1.0 + np.exp(-alpha * iter_num / max_iter)) - (high - low) + low)
### 如果self.trade_off_adversarial == 'Step',则调用此函数得到coeff的值,不然self.trade_off_adversarial == 'Cons',则coeff是个固定的值
###coeff——————coeff = self.lam_adversarial 其中trade_off_adverial充当域分类器部分的学习率随着迭代过程会逐渐递减——————学习率def grl_hook(coeff):#补充连接,因为是引入块,需要连接到model层的梯度:  grad.clone()def fun1(grad):return -coeff * grad.clone()return fun1class AdversarialNet(nn.Module):def __init__(self, in_feature, hidden_size,max_iter=10000.0, trade_off_adversarial='Step', lam_adversarial=1.0):super(AdversarialNet, self).__init__()self.ad_layer1 = nn.Sequential(nn.Linear(in_feature, hidden_size),nn.ReLU(inplace=True),nn.Dropout(),)self.ad_layer2 = nn.Sequential(nn.Linear(hidden_size, hidden_size),nn.ReLU(inplace=True),nn.Dropout(),)self.ad_layer3 = nn.Linear(hidden_size, 1)self.sigmoid = nn.Sigmoid()# parametersself.iter_num = 0self.alpha = 10self.low = 0.0self.high = 1.0self.max_iter = max_iterself.trade_off_adversarial = trade_off_adversarialself.lam_adversarial = lam_adversarialself.__in_features = 1def forward(self, x):if self.training:self.iter_num += 1if self.trade_off_adversarial == 'Cons':coeff = self.lam_adversarialelif self.trade_off_adversarial == 'Step':coeff = calc_coeff(self.iter_num, self.high, self.low, self.alpha, self.max_iter) #学习率else:raise Exception("loss not implement")x = x * 1.0x.register_hook(grl_hook(coeff))#register_hook的作用:即对x求导时,对x的导数进行操作,并且register_hook的参数只能以函数的形式传过去,#grl_hook(coeff)则返回的是梯度  *  “——”梯度反转层作用##register_hook的作用:对x求导,并将梯度保存下来,这样可以作为参数通过优化器通过反向传播过程进行更新优化,实现DANN所需效果x = self.ad_layer1(x)x = self.ad_layer2(x)y = self.ad_layer3(x)y = self.sigmoid(y)return ydef output_num(self):return self.__in_features#输出通道是1 代表域判别值0:源域 1:目标域

以上是赵志斌老师UDTL代码中的对抗网络部分的介绍,用于故障诊断数据。

这里要声明的是对于AdversarialNet网络而言,一维的数据和二维数据都可以拿来直接使用,实质上它仅仅是多出了一个二分类判别器和一个梯度反转层而已。
ZhaoZhibin/UDTL: Source codes for the paper "Applications of Unsupervised Deep Transfer Learning to Intelligent Fault Diagnosis: A Survey and Comparative Study" published in TIM (github.com)https://github.com/ZhaoZhibin/UDTL


三 网络的其他写法

这里博主还找到了另外一种的对抗网络写法。

import torch.nn as nn
from functions import ReverseLayerF#从functions中导入梯度反转层这一类class CNNModel(nn.Module):def __init__(self):super(CNNModel, self).__init__()self.feature = nn.Sequential()self.feature.add_module('f_conv1', nn.Conv2d(3, 64, kernel_size=5))#这里是因为数据是mnist数据所以输入通道为3self.feature.add_module('f_bn1', nn.BatchNorm2d(64))self.feature.add_module('f_pool1', nn.MaxPool2d(2))self.feature.add_module('f_relu1', nn.ReLU(True))self.feature.add_module('f_conv2', nn.Conv2d(64, 50, kernel_size=5))self.feature.add_module('f_bn2', nn.BatchNorm2d(50))self.feature.add_module('f_drop1', nn.Dropout2d())self.feature.add_module('f_pool2', nn.MaxPool2d(2))self.feature.add_module('f_relu2', nn.ReLU(True))
#上面是backbone部分也是网络的特征提取部分self.class_classifier = nn.Sequential()self.class_classifier.add_module('c_fc1', nn.Linear(50 * 4 * 4, 100))self.class_classifier.add_module('c_bn1', nn.BatchNorm1d(100))self.class_classifier.add_module('c_relu1', nn.ReLU(True))self.class_classifier.add_module('c_drop1', nn.Dropout())self.class_classifier.add_module('c_fc2', nn.Linear(100, 100))self.class_classifier.add_module('c_bn2', nn.BatchNorm1d(100))self.class_classifier.add_module('c_relu2', nn.ReLU(True))self.class_classifier.add_module('c_fc3', nn.Linear(100, 10))self.class_classifier.add_module('c_softmax', nn.LogSoftmax(dim=1))
#上面是源域的分类器部分,只要是要对源域数据进行有效的分类self.domain_classifier = nn.Sequential()self.domain_classifier.add_module('d_fc1', nn.Linear(50 * 4 * 4, 100))self.domain_classifier.add_module('d_bn1', nn.BatchNorm1d(100))self.domain_classifier.add_module('d_relu1', nn.ReLU(True))self.domain_classifier.add_module('d_fc2', nn.Linear(100, 2))self.domain_classifier.add_module('d_softmax', nn.LogSoftmax(dim=1))
#上面是领域判别器部分,主要任务是要区分出源域和目标域def forward(self, input_data, alpha):input_data = input_data.expand(input_data.data.shape[0], 3, 28, 28)feature = self.feature(input_data)feature = feature.view(-1, 50 * 4 * 4)reverse_feature = ReverseLayerF.apply(feature, alpha)
#前向网络中注意到,reverse_feature是通过ReverseLayerF.apply将feature进行反向的梯度计算。class_output = self.class_classifier(feature)domain_output = self.domain_classifier(reverse_feature)
#并将处理过的reverse_feature特征给domain_classifer进行域判别。return class_output, domain_output

对应的ReverseLayerF部分代码:

from torch.autograd import Functionclass ReverseLayerF(Function):@staticmethoddef forward(ctx, x, alpha):ctx.alpha = alphareturn x.view_as(x)@staticmethoddef backward(ctx, grad_output):output = grad_output.neg() * ctx.alpha
####grad_output.neg()梯度取负操作,反向内容的核心。return output, None

代码地址:https://github.com/fungtion/DANN_py3

通过介绍以上两种不同写法的对抗网络模型,相信你也可以看到对抗网络的核心其实很简单。

仅仅是多出了一个领域判别器和一个梯度反转层。

但采用对抗网络作为迁移网络方法又能很好的解决很多域迁移领域的问题,特别是在域之间的差异较大的情况时,往往要比以MMD(最大均值差异)为代表的度量学习方法效果要好。

以上是我学习过程中对DANN进行的一些总结工作,欢迎评论区讨论交流。

深度对抗神经网络(DANN)笔记相关推荐

  1. 深度学习神经网络学习笔记-多模态方向-09-VQA: Visual Question Answering

    摘要 -我们提出了自由形式和开放式视觉问答(VQA)的任务.给定一张图像和一个关于图像的自然语言问题,任务是提供一个准确的自然语言答案.镜像现实场景,比如帮助视障人士,问题和答案都是开放式的.视觉问题 ...

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

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

  3. (深度卷积生成对抗神经网络)DCGANs论文阅读与实现pytorch

    文章目录 INTRODUCTION Approach and Model Architecture 具体的修改细节 pytorch实现 可以选定特定的数字的DCGANs INTRODUCTION GA ...

  4. 深度学习~生成式对抗神经网络GAN

    目录 出现背景(why?) 概念 出现背景(why?) 在分类任务中,训练机器学习和深度学习模块需要大量的真实世界数据,并且在某些情况下,获取足够数量的真实数据存在局限性,或者仅仅是时间和人力资源的投 ...

  5. 吴恩达《神经网络与深度学习》精炼笔记(5)-- 深层神经网络

    上节课我们主要介绍了浅层神经网络.首先介绍神经网络的基本结构,包括输入层,隐藏层和输出层.然后以简单的2 layer NN为例,详细推导了其正向传播过程和反向传播过程,使用梯度下降的方法优化神经网络参 ...

  6. 吴恩达《神经网络与深度学习》精炼笔记(4)-- 浅层神经网络

    上节课我们主要介绍了向量化.矩阵计算的方法和python编程的相关技巧.并以逻辑回归为例,将其算法流程包括梯度下降转换为向量化的形式,从而大大提高了程序运算速度.本节课我们将从浅层神经网络入手,开始真 ...

  7. Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了逻辑回归,以输出概率的形式来处理二分类问题.我们介绍了逻辑回归的Cost function表达式,并使用梯度下降算法来计算最小 ...

  8. 深度卷积对抗神经网络 基础 第六部分 缺点和偏见 GANs Disadvantages and Bias

    深度卷积对抗神经网络 基础 第六部分 缺点和偏见 GANs Disadvantages and Bias GANs 综合评估 生成对抗网络(英语:Generative Adversarial Netw ...

  9. (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(4)线性神经网络(暂停)

    开源项目地址:d2l-ai/d2l-zh 教材官网:https://zh.d2l.ai/ 书介绍:https://zh-v2.d2l.ai/ 笔记基于2021年7月26日发布的版本,书及代码下载地址在 ...

  10. 深度卷积对抗神经网络 基础 第七部分 StyleGAN

    深度卷积对抗神经网络 基础 第七部分 StyleGAN 深度卷积神经网络模型已经应用在非常多的领域,但是其总包含了很多潜在的问题,比如说训练速度过慢,生成器与判别器的进化程度不平衡等等.那么,随着各种 ...

最新文章

  1. 关于全国大学生智能汽车竞赛 参赛队员信息的情况说明
  2. 用简单代码看卷积组块发展
  3. 怎么绘制机械孔_机械制图中常用的图纸简化画法,相当适合初学者!
  4. Dapr云原生应用开发系列7:工作流集成
  5. .Net Core + 微信赋能企业级智能客服系统--学习笔记
  6. LeetCode:204. 计数质数
  7. __stdcall函数调用约定
  8. hdu4405 掷骰子走格子
  9. RGB vs YCbCr(YUV)
  10. html自定义字体,css怎么自定义字体?
  11. Tupper自我指涉公式生成器
  12. 网页截图怎么截一整张_如何对整个网页页面进行截图
  13. 记录:图片转字符画及文字转字符画
  14. html语义化标签和无语义化标签
  15. xamarin Android activity生命周期详解
  16. Fiddler对手机APP进行抓包
  17. 基础算法(三) --- 轮询
  18. MEM/MBA数学强化(01)条件充分性判断
  19. 前端路线--JS高阶(day03)
  20. backtrader量化回测,基础篇,附MACD交易回测代码

热门文章

  1. VoLTE业务端到端流程:EPC侧信令流程
  2. 织梦采集插件,翻译,采集,伪原创插件
  3. 2013职称计算机幻灯片题库,2013职称计算机考试题库宝典及答案解析(全).doc
  4. Nature指数全球城市科研排名:北京第一,上海第五,南京第八
  5. 计算机音乐钢琴教程,大觉者电脑音乐教程『第十六课』——钢琴卷帘窗的使用...
  6. 串口通信以及波特率计算方法
  7. linux文件系统 ext3,Linux环境中使用Ext3文件系统
  8. 实现校园网花样上网方法
  9. Webservice原理解析
  10. 虚拟偶像大众化元年,如何挖掘蓝海市场|虚拟偶像公司2020年盘点