【迁移学习】深度域自适应网络DANN模型

article/2025/11/8 19:00:58

DANN

  • Domain-Adversarial Training of Neural Networks in Tensorflow
  • 域适配:目标域与源域的数据分布不同但任务相同下的迁移学习。

模型建立

  • DANN假设有两种数据分布:源域数据分布 S ( x , y ) \mathcal{S}(x,y) S(x,y)和目标域数据分布 T ( x , y ) \mathcal{T}(x,y) T(x,y);定义 d i d_i di为第 i i i个训练样本的域标签, d i ∈ { 0 , 1 } d_i\in\{0,1\} di{0,1},若 d i = 0 d_i=0 di=0,则 x i ∼ S ( x ) x_i\sim\mathcal{S}(x) xiS(x),反之 d i = 1 d_i=1 di=1 x i ∼ T ( x ) x_i\sim\mathcal{T}(x) xiT(x)

  • DANN网络的输入 x ∈ X x\in X xX X X X表示图像输入空间;图像分类标签 y ∈ Y y\in Y yY,其中 Y ( Y = { 1 , 2 , 3 , . . . , k } ) Y(Y=\{1,2,3,...,k\}) Y(Y={1,2,3,...,k})表示图像分类标签空间。在输入中,既有带标签的源域数据集也有不带标签的目标域数据集。

  • DANN的目标:准确预测目标域输入图像的分类标签

  • DANN网络构架:
    在这里插入图片描述
    绿色部分:特征提取网络;蓝色部分:图像分类网络;(绿蓝一起构成标准前馈结构)红色部分:域分类网络

    • 输入 x x x在训练阶段首先经过特征提取网络 f = G f ( x ; θ y ) f=G_f(x;\theta_y) f=Gf(x;θy)的映射转换为一个 D D D维特征向量。

      • 分支1:图像分类预测网络 G y ( x ; θ y ) G_y(x;\theta_y) Gy(x;θy)

        源域数据对应的特征向量通过预测网络获得对应分类标签预测结果。

      • 分支2:域分类网络 G d ( x ; θ d ) G_d(x;\theta_d) Gd(x;θd)

        源域和目标域输入对应的特征向量经过域分类网络得到每个输入的域分类结果。

  • 为了实现让DANN将目标域数据看成源域数据,在训练阶段需实现两个任务:

  1. 源域数据及准确分类,即分类误差最小化
  2. 混淆源域数据集和目标数据集,实现域分类误差最大化。

由于域分类器与图像分类器的输入都来自于特征提取网络,但分别要求分类损失最小化和最大化。

如果使用随机梯度下降法(SGD)来优化模型损失函数的,会导致特征提取器在进行参数更新时,域分类损失和分类预测损失梯度相反

  • DANN提出了新的梯度反转层(Gradient Reversal Layer,GRL),使得在反向传播的过程中梯度方向自动取反,在前向传播过程中只做恒等变换:

R λ ( x ) = x d R λ d x = − λ I \begin{gathered}R_\lambda(x)=x\\\frac{dR_{\lambda}}{dx}=-\lambda I\end{gathered} Rλ(x)=xdxdRλ=λI

  • 梯度反转层被插在特征提取层和与分类器之间,则在反向传播的过程中,域分类器的域分类损失的梯度反向传播到特征提取器之前会自动取反( λ \lambda λ随迭代次数动态变化)

论文:Unsupervised Domain Adaptation by Backpropagation

参考博客:【深度域适配】一、DANN与梯度反转层(GRL)详解

实验:MNIST域与MNIST-M域间的迁移学习

github传送门:https://github.com/pumpikano/tf-dann

运行环境

  • tensorflow >=1.0
  • Python 3.4

  • numpy
  • scikit-image
  • matplotlib
  • scikit-learn
  • jupyter
  • scipy

实验数据

  • MNIST作为源域,MNIST-M作为目标域。

    MNIST-M为将从BSDS的彩色照片中随机抽取的原始集合上的数字随机混合到MNIST的patch上——与原始数据及相比,背景和笔画不再恒定,域相当不同,但输出图片对人类来说仍看可区分出数字。

  • 样本均为28*28*3的图片,3代表RGB值

源域数据
源域数据与目标域数据
输入x:batch*28*28*3
两层CNN特征提取器
输出:batch*7*7*48
预测分类器
梯度反转层
域分类器
输出预测y
计算损失函数梯度
输出域分类结果d
计算损失函数梯度

http://chatgpt.dhexx.cn/article/VRpWLtIK.shtml

相关文章

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

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

Domain-Adversarial Training of Neural Networks

本篇是迁移学习专栏介绍的第十八篇论文,发表在JMLR2016上。 Abstrac 提出了一种新的领域适应表示学习方法,即训练和测试时的数据来自相似但不同的分布。我们的方法直接受到域适应理论的启发,该理论认为,要实现有效的域转移&#…

DANN:Domain-Adversarial Training of Neural Networks

DANN原理理解 DANN中源域和目标域经过相同的映射来实现对齐。 DANN的目标函数分为两部分: 1. 源域分类损失项 2. 源域和目标域域分类损失项 1.源域分类损失项 对于一个m维的数据点X,通过一个隐含层Gf,数据点变为D维: 然后经…

DaNN详解

1.摘要 本文提出了一个简单的神经网络模型来处理目标识别中的域适应问题。该模型将最大均值差异(MMD)度量作为监督学习中的正则化来减少源域和目标域之间的分布差异。从实验中,本文证明了MMD正则化是一种有效的工具,可以为特定图像数据集的SURF特征建立良好的域适应模型。本…

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

文章目录 概述原理回顾 (可跳过)GRL 层实现使用 GRL 的域对抗(DANN)模型实现DANN 的使用案例 !!!后记 概述 域对抗训练(Domain-Adversarial Training of Neural Networks,DANN)属于广义迁移学习的一种, 可以矫正另一个域的数据集的分布, 也可…

DANN 领域迁移

DANN(Domain Adaptation Neural Network,域适应神经网络)是一种常用的迁移学习方法,在不同数据集之间进行知识迁移。本教程将介绍如何使用DANN算法实现在MNIST和MNIST-M数据集之间进行迁移学习。 首先,我们需要了解两个…

DANN-经典论文概念及源码梳理

没错,我就是那个为了勋章不择手段的屑(手动狗头)。快乐的假期结束了哭哭... DANN 对抗迁移学习 域适应Domain Adaption-迁移学习;把具有不同分布的源域(Source Domain)和目标域(Target Domain…

EHCache 单独使用

参考: http://macrochen.blogdriver.com/macrochen/869480.html 1. EHCache 的特点,是一个纯Java ,过程中(也可以理解成插入式)缓存实现,单独安装Ehcache ,需把ehcache-X.X.jar 和相关类库方到classpath中…

ehcache 的使用

http://my.oschina.net/chengjiansunboy/blog/70974 在开发高并发量,高性能的网站应用系统时,缓存Cache起到了非常重要的作用。本文主要介绍EHCache的使用,以及使用EHCache的实践经验。 笔者使用过多种基于Java的开源Cache组件,其…

Ehcache 的简单使用

文章目录 Ehcache 的简单使用背景使用版本配置配置项编程式配置XML 配置自定义监听器 验证示例代码 改进代码 备注完整示例代码官方文档 Ehcache 的简单使用 背景 当一个JavaEE-Java Enterprise Edition应用想要对热数据(经常被访问,很少被修改的数据)进行缓存时&…

SpringBoot 缓存(EhCache 使用)

SpringBoot 缓存(EhCache 使用) 源文链接:http://blog.csdn.net/u011244202/article/details/55667868 SpringBoot 缓存(EhCache 2.x 篇) SpringBoot 缓存 在 Spring Boot中,通过EnableCaching注解自动化配置合适的缓存管理器(CacheManager…

shiro框架04会话管理+缓存管理+Ehcache使用

目录 一、会话管理 1.基础组件 1.1 SessionManager 1.2 SessionListener 1.3 SessionDao 1.4 会话验证 1.5 案例 二、缓存管理 1、为什么要使用缓存 2、什么是ehcache 3、ehcache特点 4、ehcache入门 5、shiro与ehcache整合 1)导入相关依赖&#xff0…

使用Ehcache的两种方式(代码、注解)

Ehcache,一个开源的缓存机制,在一些小型的项目中可以有效的担任缓存的角色,分担数据库压力此外,ehcache在使用上也是极为简单, 下面是简单介绍一下ehcahce的本地使用的两种方式: 1,使用代码编写的方式使用…

EhCache常用配置详解和持久化硬盘配置

一、EhCache常用配置 EhCache 给我们提供了丰富的配置来配置缓存的设置; 这里列出一些常见的配置项: cache元素的属性: name:缓存名称 maxElementsInMemory:内存中最大缓存对象数 maxElementsOnDisk&#xff…

EhCache初体验

一、简介 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支…

setw()使用方法

使用setw(n)之前&#xff0c;要使用头文件iomanip 使用方法: #include<iomanip> 1、setw&#xff08;int n&#xff09;只是对直接跟在<<后的输出数据起作用&#xff0c;而在之后的<<需要在之前再一次使用setw&#xff1b; &#xff08;Sets the number of…

c语言iomanip头文件的作用,iomanip头文件的作用

在c程序里面经常见到下面的头文件 #include io代表输入输出&#xff0c;manip是manipulator(操纵器)的缩写(在c上只能通过输入缩写才有效。) 作用(推荐学习&#xff1a;C语言视频教程) 主要是对cin,cout之类的一些操纵运算子&#xff0c;比如setfill,setw,setbase,setprecisio…

QT学习C++(6)

立方体的类设计 设计立方体类&#xff0c;求出立方体的面积(2ad2ac2bc)和体积(a*b*c)&#xff0c;分别用全局函数和成员函数判断两个立方体是否相等&#xff1f; #include <iostream>using namespace std; class Cube{ private://数据&#xff0c;长宽高int c_l;int c_w…

C++中使用setw()使用方法

setw(int n)是c中在输出操作中使用的字段宽度设置&#xff0c;设置输出的域宽&#xff0c;n表示字段宽度。只对紧接着的输出有效&#xff0c;紧接着的输出结束后又变回默认的域宽。当后面紧跟着的输出字段长度小于n的时候&#xff0c;在该字段前面用空格补齐&#xff1b;当输出…

关系代数表达式的优化

查询的处理的代价通常取决于磁盘访问&#xff0c;磁盘访问比内存访问速度慢很多。 在这里由于计算机原理的知识的欠缺&#xff0c;理解起来有点费劲&#xff0c;例如不知道关系的连接在哪里进行&#xff0c;连接的中间结果放在哪里&#xff0c;计算后的结果怎么处理&#xff0c…