【域适应论文汇总】未完结

news2024/11/22 10:59:25

文章目录

  • DANN:Unsupervised Domain Adaptation by Backpropagation (2015)
  • TADA:Transferable Attention for Domain Adaptation(2019 AAAI)
      • 1 局部注意力迁移:Transferable Local Attention
      • 2 全局注意力迁移:Transferable Global Attention
  • DAN:Learning transferable features with deep adaptation networks(JMLR 2015)
  • ADDA:Adversarial discriminative domain adaptation(CVPR 2017)
      • 1 报错
      • 2 代码
      • 3 判别器
      • 4 分类器
      • 5 adapt
  • MCD:Maximum classifier discrepancy for unsupervised domain adaptation(CVPR 2018)
  • MDD:Bridging theory and algorithm for domain adaptation
  • CDAN:Conditional Adversarial Domain Adaptation(Neural 2018)
  • MCC:Moment Matching for Multi-Source Domain Adaptation(ICCV 2019)
  • DAPL:Domain Adaptation via Prompt Learning(DA+prompt)(arXiv 2022)
  • 特征提取器优化

DANN:Unsupervised Domain Adaptation by Backpropagation (2015)

提出DANN
在这里插入图片描述

TADA:Transferable Attention for Domain Adaptation(2019 AAAI)

提出了TADA

  • 由多个区域级 鉴别器产生的局部注意力来突出可迁移的区域
  • 由单个图像级 鉴别器产生的全局注意力来突出可迁移的图像

通过注意力机制挑选出可迁移的图像以及图像中可以重点迁移的区域。因此作者提出了两个与注意力机制结合的迁移过程:

  • Transferable Local Attention
  • Transferable Global Attention。
    在这里插入图片描述

1 局部注意力迁移:Transferable Local Attention

在这里插入图片描述
TADA与DANN的思想相同,都是通过一个特征提取器 来提取特征,之后会将提取的特征输入到域判别器 。但是TADA不同之处在于它的域判别器有多个,并且每一个域判别器是针对专门的一块区域的。在DANN中域判别器是判断输入的所有特征组合起来是属于源域还是目标域,而在TADA中每个域判别器只需要判断当前的这一块区域是属于源域还是目标域的。通过这种做法,可以将源域的图片拆开,找出最有用的区域信息,并且将不可迁移的源域信息过滤掉,减小负迁移的风险。

2 全局注意力迁移:Transferable Global Attention

在这里插入图片描述

这一步骤和DANN的操作更为相似,作者的目的是找出哪些特征映射更值得迁移,不再将特征映射划分为各个区域,而是关注它的整体。

DAN:Learning transferable features with deep adaptation networks(JMLR 2015)

代码

  • 在DAN中,所有特定于任务的层的隐藏表示都嵌入到一个可复制的内核Hilbert空间中,在这个空间中可以显式匹配不同域分布的平均嵌入。
  • 采用均值嵌入匹配的多核优化选择方法,进一步减小了domain间的差异。
  • DAN可以在有统计保证的情况下学习可转移的特性,并且可以通过核嵌入的无偏估计进行线性扩展。
    在这里插入图片描述

1 多层自适应

基本结构是AlexNet,其中三个全连接都已经和特定任务练习密切,当用于其他任务或数据集时会有较大误差,于是作者提出在最后的三个全连接层都使用MMD进行分布距离约束,从而使得模型具备更强的迁移能力。至于前边的卷积层,前三层提取到的是更为一般的特征,在预训练之后权重固定,4、5两层则要在预训练的基础上进行fine-tune(调整,以致达到最佳效果)

2 多核自适应

分布匹配主要依靠MMD作为分布距离约束来实现,而MMD的效果依赖于核函数的选择,单一核函数的表达能力是有限的,因此作者提出使用多核MMD (MK-MMD) 来作为损失

3 CNN经验误差

在这里插入图片描述- J:交叉熵损失函数

  • θ ( x i a ) θ(x_i^{a}) θ(xia) x i a x_i^{a} xia被分配到 y i a y_i^{a} yia的条件概率

4 优化目标

在这里插入图片描述

  • D s ℓ D^ℓ_s Ds:源域的第 ℓ ℓ 层隐藏表征
  • D t ℓ D^ℓ_t Dt:目标域的第 ℓ ℓ 层隐藏表征
  • d k 2 ( D s ℓ , D t ℓ ) d_k^2(D^ℓ_s, D^ℓ_t) dk2(Ds,Dt):MK-MMD评估值

5 learning Θ Θ Θ

MK-MMD计算内核功能的期望
在这里插入图片描述

6 learning β β β

多层执行MK-MMD匹配

ADDA:Adversarial discriminative domain adaptation(CVPR 2017)

在这里插入图片描述

  • 使用标记的源图像示例预训练源编码器CNN
  • 通过学习目标编码器CNN来执行对抗性适应,使得看到编码源和目标示例的鉴别器无法可靠地预测它们的域标签
  • 在测试过程中,目标图像与目标编码器一起映射到共享特征空间,并由源分类器进行分类

1 报错

  1. RuntimeError: result type Float can’t be cast to the desired output type Long
    acc /= len(data_loader.dataset)
    改成
    acc = acc / len(data_loader.dataset)

  2. 取ViT输出的池化后结果
    pred_tgt = critic(feat_tgt)
    增加 pooler_output
    pred_tgt = critic(feat_tgt.pooler_output)

  3. RuntimeError: output with shape [1, 28, 28] doesn’t match the broadcast shape [3, 28, 28]
    mnist和usps需要从灰度图片转成RGB图片,通道数从1变成3

transform = transforms.Compose([
        transforms.Resize((224, 224)),  # 调整大小为 224x224
        transforms.Grayscale(num_output_channels=3),  #转化成3通道
        transforms.ToTensor(),  # 将图像转换为张量
    ])
  1. IndexError: invalid index of a 0-dim tensor. Use tensor.item() in Python or tensor.item<T>() in C++ to convert a 0-dim tensor to a number
    .data[0]
    改成
    .item()

2 代码

将lenet encoder换成vit

import torch
from transformers import ViTModel, ViTConfig
# 下载 vit-base-patch16-224-in21k 


def load_pretrained_vit_model():
    # Load pre-trained ViT-B/16 model
    model_path = "./pretrained_models/pytorch_model.bin"
    config_path = "./pretrained_models/config.json"
    config = ViTConfig.from_json_file(config_path)
    vit_model = ViTModel.from_pretrained(pretrained_model_name_or_path=None,
                                         config=config,
                                         state_dict=torch.load(model_path),
                                         ignore_mismatched_sizes=True  # 忽略大小不匹配的错误
                                         )
    return vit_model

3 判别器

"""Discriminator model for ADDA."""
from torch import nn
class Discriminator(nn.Module):
    """Discriminator model for source domain."""

    def __init__(self, input_dims, hidden_dims, output_dims):
        """Init discriminator."""
        super(Discriminator, self).__init__()
        print("Shape of input_dims:", input_dims)
        self.restored = False

        self.layer = nn.Sequential(
            nn.Linear(input_dims, hidden_dims),
            nn.ReLU(),
            nn.Linear(hidden_dims, hidden_dims),
            nn.ReLU(),
            nn.Linear(hidden_dims, output_dims)
            ,
            nn.LogSoftmax()
        )

    def forward(self, input):
        """Forward the discriminator."""
        out = self.layer(input)
        return out

4 分类器

"""LeNet model for ADDA."""
import torch
import torch.nn.functional as F
from torch import nn

class LeNetClassifier(nn.Module):
    """LeNet classifier model for ADDA."""
    def __init__(self, input_size):
        """Init LeNet encoder."""
        super(LeNetClassifier, self).__init__()
        self.input_size = input_size

        # Add linear layers to adjust the size of the input feature to fit LeNet
        # vit
        self.fc1 = nn.Linear(input_size, 500)
        # swin
        # self.fc1 = nn.Linear(49 * 1024, 500)

        self.fc2 = nn.Linear(500, 10)

    def forward(self, feat):
        """Forward the LeNet classifier."""
        # vit
        feat = feat.pooler_output

        # swin
        # feat = feat.view(feat.size(0), -1)

        # Apply the linear layers and activation function
        out = F.dropout(F.relu(self.fc1(feat)), training=self.training)
        out = self.fc2(out)
        return out

5 adapt

"""Adversarial adaptation to train target encoder."""
import os
import torch
import torch.optim as optim
from torch import nn
import params
from utils import make_variable


def train_tgt(src_encoder, tgt_encoder, critic,
              src_data_loader, tgt_data_loader,model_type):
    """Train encoder for target domain."""
    ####################
    # 1. setup network #
    ####################

    # set train state for Dropout and BN layers
    tgt_encoder.train()
    critic.train()

    # setup criterion and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer_tgt = optim.Adam(tgt_encoder.parameters(),
                               lr=params.c_learning_rate,
                               betas=(params.beta1, params.beta2))
    optimizer_critic = optim.Adam(critic.parameters(),
                                  lr=params.d_learning_rate,
                                  betas=(params.beta1, params.beta2))
    len_data_loader = min(len(src_data_loader), len(tgt_data_loader))

    ####################
    # 2. train network #
    ####################

    for epoch in range(params.num_epochs):
        # zip source and target data pair
        data_zip = enumerate(zip(src_data_loader, tgt_data_loader))
        for step, ((images_src, _), (images_tgt, _)) in data_zip:
            ###########################
            # 2.1 train discriminator #
            ###########################
            # make images variable
            images_src = make_variable(images_src.cuda())
            images_tgt = make_variable(images_tgt.cuda())

            # zero gradients for optimizer
            optimizer_critic.zero_grad()

            # extract and concat features
            feat_src = src_encoder(images_src).pooler_output
            feat_tgt = tgt_encoder(images_tgt).pooler_output
            feat_concat = torch.cat((feat_src, feat_tgt), 0)

            # predict on discriminator
            pred_concat = critic(feat_concat.detach())

            # prepare real and fake label
            label_src = make_variable(torch.ones(feat_src.size(0)).long().cuda())
            label_tgt = make_variable(torch.zeros(feat_tgt.size(0)).long().cuda())
            label_concat = torch.cat((label_src, label_tgt), 0)

            # compute loss for critic
            loss_critic = criterion(pred_concat, label_concat)
            loss_critic.backward()

            # optimize critic
            optimizer_critic.step()

            pred_cls = torch.squeeze(pred_concat.max(1)[1])
            
            ############################
            # 2.2 train target encoder #
            ############################

            # zero gradients for optimizer
            optimizer_critic.zero_grad()
            optimizer_tgt.zero_grad()

            # extract and target features
            feat_tgt = tgt_encoder(images_tgt)

            # predict on discriminator
            pred_tgt = critic(feat_tgt.pooler_output)

            # prepare fake labels
            label_tgt = make_variable(torch.ones(feat_tgt.last_hidden_state.size(0)).long().cuda())

            # compute loss for target encoder
            loss_tgt = criterion(pred_tgt, label_tgt)
            loss_tgt.backward()

            # optimize target encoder
            optimizer_tgt.step()

            #######################
            # 2.3 print step info #
            #######################
            if (step + 1) % params.log_step == 0:
                print("Epoch [{}/{}] Step [{}/{}]:"
                      "d_loss={:.5f} g_loss={:.5f} acc={:.5f}"
                      .format(epoch + 1,
                              params.num_epochs,
                              step + 1,
                              len_data_loader,
                              loss_critic.item(),
                              loss_tgt.item(),
                              acc.item()))

        #############################
        # 2.4 save model parameters #
        #############################
    if ((epoch + 1) % params.save_step == 0):
        # 保存模型时加上特征提取器的标识符
        if model_type == "vit":
            model_name = "ADDA-target-encoder-ViT-{}.pt".format(epoch + 1)
        elif model_type == "mobilevit":
            model_name = "ADDA-target-encoder-MobileViT-{}.pt".format(epoch + 1)
        elif model_type == "swin":
            model_name = "ADDA-target-encoder-Swin-{}.pt".format(epoch + 1)

        torch.save(tgt_encoder.state_dict(), os.path.join(
            params.model_root,
            model_name))

    # 保存最终模型时也加上特征提取器的标识符
    if model_type == "vit":
        final_model_name = "ADDA-target-encoder-ViT-final.pt"
    elif model_type == "mobilevit":
        final_model_name = "ADDA-target-encoder-MobileViT-final.pt"
    elif model_type == "swin":
        final_model_name = "ADDA-target-encoder-Swin-final.pt"

    torch.save(tgt_encoder.state_dict(), os.path.join(
        params.model_root,
        final_model_name))
    return tgt_encoder

MCD:Maximum classifier discrepancy for unsupervised domain adaptation(CVPR 2018)

最大分类器差异的领域自适应
引入两个独立的分类器F1、F2,用二者的分歧表示样本的置信度不高,需要重新训练。在这里插入图片描述
判别损失有两部分组成

MDD:Bridging theory and algorithm for domain adaptation

CDAN:Conditional Adversarial Domain Adaptation(Neural 2018)

条件生成对抗网络,在GAN基础上做的一种改进,通过给原始的GAN的生成器和判别器添加额外的条件信息,实现条件生成模型

复现代码:https://www.cnblogs.com/BlairGrowing/p/17099742.html

提出一个条件对抗性域适应方法(CDAN),对分类器预测中所传递的判别信息建立了对抗性适应模型。条件域对抗性网络(CDAN)采用了两种新的条件调节策略:

  • 多线性条件调节,通过捕获特征表示与分类器预测之间的交叉方差来提高分类器的识别率
  • 熵条件调节,通过控制分类器预测的不确定性来保证分类器的可移植性

MCC:Moment Matching for Multi-Source Domain Adaptation(ICCV 2019)

DAPL:Domain Adaptation via Prompt Learning(DA+prompt)(arXiv 2022)

代码:https://github.com/LeapLabTHU/DAPrompt
使用预训练的视觉语言模型,优化较少的参数,将信息嵌入到提示中,每个域中共享。
只有当图像和文本的领域和类别分别匹配的时候,他们才形成一对正例。

特征提取器优化

  • ViT
    已部署,测试中

  • Swin Transformer:基于 Transformer 结构的新型模型,计算复杂度可能更高一些(对性能要求较高)

  • MobileViT:CNN的轻量高效,transformer的自注意力机制和全局视野,在速度和内存消耗方面优秀(2021)
    文章:MobileViT: Light-Weight, General-Purpose, and Mobile-Friendly Vision Transformer

  • ConvNeXt:结合了CNN和 Transformer 的模型(2022)
    文章:A ConvNet for the 2020s
    ConvNeXt用100多行代码就能搭建完成,相比Swin Transformer拥有更简单,更快的推理速度以及更高的准确率

  • EfficientNetV2:Google 提出的一系列高效的卷积神经网络,通过使用复合缩放方法和网络深度调整策略,实现了在不同任务上的良好性能和高效计算(对移动设备友好)(2021)

  • MobileNetV3:针对移动设备的轻量级卷积神经网络,有更快的推理速度和更低的内存消耗(对移动设备友好)(2019)

PyTorch Hub 下载模型
https://huggingface.co/models

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云2核4G5M服务器199元一年性能测评

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

2024年开学季推荐:数码装备购物清单,校园生活必备神器

随着开学的钟声即将敲响&#xff0c;全新的学年画卷正在缓缓展开。它不仅承载着我们对知识的渴望和对未来的憧憬&#xff0c;更是我们挥洒青春、展示才华的舞台。在这个充满无限可能的新起点&#xff0c;每一位学子都怀着期待&#xff0c;准备踏上成长的征程。然而为了更好地适…

Linux忘记mysql密码

Linux忘记mysql密码 我们在linux操作系统上&#xff0c;输入密码 出现这样的错误 解决 1.首先我们需要修改/etc/my.cnf vim /etc/my.cnf2.我们需要再文件的最后一行添加 skip-grant-tables跳过权限表 3.我们保存文件&#xff0c;之后重启mysql service mysqld restart4.…

阿里云ECS u1实例2核4G5M固定带宽80G ESSD Entry盘性能测评

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

暂时的停更

最近因学业紧张&#xff0c;暂时停更&#xff0c;但还是会上线 我的专栏&#xff1a;C教程 感谢大家的支持

浅谈 目录项(dentry) 、 inode 、硬链接

文章目录 名词解释inode 介绍dentry 介绍硬链接 介绍 名词解释 inode&#xff1a;索引节点&#xff0c;是一个结构体&#xff0c;存储文件的属性等信息。 dentry&#xff1a;目录项&#xff0c;是一个 dir_entry 结构体&#xff0c;重要成员有文件的 inode 索引号&#xff0c;…

[NPUCTF2020]ezinclude ---不会编程的崽

做完这题&#xff0c;又get到一个新的知识点。上界面 源代码里有线索 secret是秘密值&#xff0c;name与pass应该是可以控制的变量。抓个包看看 发送与请求有hash值&#xff0c;没猜错应该是用来验证的。拿去爆破了&#xff0c;啥也没爆破出来。先传参 右边的hash值改变了。猜想…

Transformer视频理解学习的笔记

今天复习了Transformer,ViT, 学了SwinTransformer, 还有观看了B站视频理解沐神系列串讲视频上&#xff08;24.2.26未看完,明天接着看&#xff09; 这里面更多论文见&#xff1a;https://github.com/mli/paper-reading/ B站视频理解沐神系列串讲视频下&#xff08;明天接着看&a…

matlab动力学共振颤振研究

1、内容简介 略 58-可以交流、咨询、答疑 采用四阶龙哥库塔方法求解方程组&#xff0c;方便控制碰撞的时间&#xff0c;检测到碰撞的时间&#xff0c;改变速度&#xff0c;调整位移&#xff0c;碰撞检测通过对比相对位移 2、内容说明 略 基本思路&#xff1a;采用四阶龙哥…

【前沿热点视觉算法】-面向显著目标检测的注意区域空间金字塔池网络

计算机视觉算法分享。问题或建议&#xff0c;请文章私信或者文章末尾扫码加微信留言。 1 论文题目 面向显著目标检测的注意区域空间金字塔池网络 2 论文摘要 显著目标检测&#xff08;SOD&#xff09;的最新进展主要依赖于空间空间金字塔池&#xff08;ASPP&#xff09;模块…

2024全国水科技大会暨土壤和地下水污染防治与修复技术创新论坛(七)

论坛召集人&#xff1a;李 辉 上海大学环境与化学工程学院教授 一、会议背景 十四五”时期&#xff0c;我国生态文明建设进入以减污降碳协同增效为重点战略方向&#xff0c;促进经济社会发展全面绿色转型&#xff0c;实现生态环境质量改善由量变到质变的关键时期。聚焦土壤与地…

如何操作系统缓冲区减少了磁盘碎片化?

如何操作系统缓冲区减少了磁盘碎片化&#xff1f; 在探讨操作系统如何通过使用缓冲区来减少磁盘碎片化之前&#xff0c;我们需要先了解什么是磁盘碎片化以及它为什么会对我们的电脑性能造成影响。 磁盘碎片化简介 磁盘碎片化发生在计算机硬盘上存储数据的过程中。简单来说&am…

vue中动态表格中文校验,但是中文的参数无法获取

场景&#xff1a; 解决方案&#xff1a; 因为上述的正则表达式后&#xff0c;使用搜狗输入法没有问题&#xff0c;但采用微软自带输入法后&#xff0c;会存在输入数字及英文时为正常&#xff0c;切换为汉字后&#xff0c;会存在吞并当前光标前的字符。具体吞并个数和输入法中有…

Syntax Error: Error: Cannot find module ‘node-sass‘报错解决

1.将项目中的node_modules删除掉 2.npm install重新运行安装命令 3.再npm run serve&#xff08;项目启动命令&#xff09;启动项目即可

27.HarmonyOS App(JAVA)可复用列表项的ListContainer

可复用列表项的ListContainer 简短的列表可以通过定向布局实现,但是如果列表项非常多,则使用定向布局就不再合适。如需要创建50个列表项的列表,那么用定向布局实现至少需要创建50个以上的组件了。然而,限于设备屏幕大小的限制,绝大多数组件不会显示在屏幕上,却会占据大量的内存…

Segment Routing IPv6介绍

定义 SRv6&#xff08;Segment Routing IPv6&#xff0c;基于IPv6转发平面的段路由&#xff09;是基于源路由理念而设计的在网络上转发IPv6数据包的一种协议。SRv6通过在IPv6报文中插入一个路由扩展头SRH&#xff08;Segment Routing Header&#xff09;&#xff0c;在SRH中压…

链栈的代码

1.c #include"1.h" //申请栈顶指针 top_p create_top() {top_p top (top_p)malloc(sizeof(top_t));if(topNULL){printf("空间申请失败\n");return NULL;}top->len 0;top->ptop NULL; //刚申请栈指针时没有指向元素return top; } //申请结点的函…

贪心算法学习

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤为有效。然而&#xff0c;要注意的是贪心…

matlab关键路径的工序安排和dijkstra路径规划

1、内容简介 略 59-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 matlab关键路径的工序安排和dijkstra路径规划_哔哩哔哩_bilibili 4、参考论文 略

亚洲唯一!京东荣获2024年度Gartner供应链技术创新奖背后的创新探索

序言&#xff1a; 序言&#xff1a;2月14日晚间&#xff0c;Gartner公布了2024年度Garter Power of the Profession供应链大奖&#xff0c;京东集团荣获供应链技术创新奖&#xff0c;成为获得该奖项的唯一亚洲企业。Gartner Power of the Profession供应链奖项已经举办十年&am…