DAAN学习笔记

目录

 

背景

传统方法

DAAN

 代码介绍


背景

迁移学习中目标域和源域数据之间存在分布差异,这个差异不仅仅有边界分布差异,也可能是条件分布差异,更多的可能是二者同时存在。确立哪种分布对数据的影响更大,对应的调节网络参数,可以更好的调节源域与目标域之间的领域差异大小,以此实现更好的迁移效果。

不同的分布之间的差异如图所示:


传统方法

传统的基线对抗网络模型DANN,针对边际分布差异较大的情况下,效果会比较好。然而它对于域内子类,即域内的类别与其他域内同类别样本的边界判断效果并不好。基于此,一般我们会引入条件分布,但一般数据间的迁移,二者的分布差异都有的。如何调整二者之间的分布权重,成为了新的研究问题。

论文中提到MEDA方法虽然旨在自适应对齐两种分布。但它存在以下问题。

(1)需要训练c+1个额外线性分类器,这既昂贵又耗时。

(2)它只能适应小的数据集

(3)且由于每次都要计算所有样本的伪逆,所以无法在线部署。

关于传统的DANN方法可以看我的博客:

深度对抗神经网络(DANN)笔记_谁知故人不识君的博客-CSDN博客

MEDA论文地址:

Visual Domain Adaptation with Manifold Embedded Distribution Alignment | Proceedings of the 26th ACM international conference on Multimedia


DAAN

DAAN (Dynamic Adversarial Adaptation Network)一种可以动态调整边界和条件分布关系的深度对抗网络模型,它的基础网络与DANN网络基本一致,核心在于引入了条件域判别块和集成化的动态调节因子ω,下面是DANN网络结构图与DAAN的网络结构图。



代码介绍

from loss_funcs.adv import *

class DAANLoss(AdversarialLoss, LambdaSheduler):
    def __init__(self, num_class, gamma=1.0, max_iter=1000, **kwargs):
        super(DAANLoss, self).__init__(gamma=gamma, max_iter=max_iter, **kwargs)
        self.num_class = num_class
###子域判别器,加入条件对抗判别器
        self.local_classifiers = torch.nn.ModuleList()
        for _ in range(num_class):
            self.local_classifiers.append(Discriminator())

        self.d_g, self.d_l = 0, 0
        self.dynamic_factor = 0.5
### 动态调节因子dynamic_factor
###需要源域和目标域经过分类器预测的source_logits和target_logits作为BCELOSS的输入求出源域的全局损失和local 损失,目标域也是如此。最后计算得出源域和目标域的全局损失和local损失。
    def forward(self, source, target, source_logits, target_logits):
        lamb = self.lamb()
        self.step()
        source_loss_g = self.get_adversarial_result(source, True, lamb)
        target_loss_g = self.get_adversarial_result(target, False, lamb)
        source_loss_l = self.get_local_adversarial_result(source, source_logits, True, lamb)
        target_loss_l = self.get_local_adversarial_result(target, target_logits, False, lamb)
        global_loss = 0.5 * (source_loss_g + target_loss_g) * 0.05
        local_loss = 0.5 * (source_loss_l + target_loss_l) * 0.01#得到的值是所有类的总和,最后要除类总数,得到一个子类loss的平均值
        #源域和目标域比例是1:1,所以总数×0.5

        self.d_g = self.d_g + 2 * (1 - 2 * global_loss.cpu().item())#定义全局A距离
        self.d_l = self.d_l + 2 * (1 - 2 * (local_loss / self.num_class).cpu().item())
#err(h)表示的是平均值

        adv_loss = (1 - self.dynamic_factor) * global_loss + self.dynamic_factor * local_loss
        """
       adv_loss = (1 - self.dynamic_factor) * global_loss + self.dynamic_factor * local_loss
        self.dynamic_factor 全局w动态平衡参数
        """
        return adv_loss
 ### adv_loss 是新的域判别器损失  
    def get_local_adversarial_result(self, x, logits, c, source=True, lamb=1.0):
        loss_fn = nn.BCELoss()
        x = ReverseLayerF.apply(x, lamb)#这个x是输入类判别器中的特征值
        loss_adv = 0.0

        for c in range(self.num_class):
            logits_c = logits[:, c].reshape((logits.shape[0],1))
            # (B, 1)
            features_c = logits_c * x
            domain_pred = self.local_classifiers[c](features_c)
#第几个分类器,使用这一类的特征数据
            device = domain_pred.device
            if source:
                domain_label = torch.ones(len(x), 1).long()
            else:
                domain_label = torch.zeros(len(x), 1).long()
            loss_adv = loss_adv + loss_fn(domain_pred, domain_label.float().to(device))
        return loss_adv
#更新动态调节因子w的函数    
    def update_dynamic_factor(self, epoch_length):
        if self.d_g == 0 and self.d_l == 0:
            self.dynamic_factor = 0.5
            """
            初始化参数的条件
            """
        else:
            self.d_g = self.d_g / epoch_length#平均值
            self.d_l = self.d_l / epoch_length
            self.dynamic_factor = 1 - self.d_g / (self.d_g + self.d_l)#原论文是后面为w
        self.d_g, self.d_l = 0, 0

与之对应的相关公式可以查看论文的第三部分。

文章仅供初步了解,代码来自王晋东老师的开源代码库,只截取了比较关键的对抗损失函数部分,具体学习可以关注王晋东老师的开源代码库。

最后希望本文能对您学习深度迁移学习有所帮助,欢迎评论区沟通交流,互相学习。

论文地址:

Transfer Learning with Dynamic Adversarial Adaptation Network | IEEE Conference Publication | IEEE Xplore

开源代码库地址:

GitHub - jindongwang/transferlearning: Transfer learning / domain adaptation / domain generalization / multi-task learning etc. Papers, codes, datasets, applications, tutorials.-迁移学习

03-23
<think>嗯,用户提到的问题是关于“DAAN 数据库系统使用或错误”。首先需要确定“DAAN”具体指什么。可能的情况包括: 1. **拼写错误或缩写**:用户可能想输入的是“DBA”(数据库管理员)或“DAAN”是某个特定数据库系统的名称或缩写。例如,可能存在一个名为DAAN的专有数据库系统,但常见系统中并没有此名称,需要进一步确认。 2. **相关术语混淆**:可能与数据库安全(如引用[2]中提到的数据库安全性)或数据库管理功能(如引用[3]中的SQL语言功能)有关。需要结合用户提供的引用内容分析。 根据用户提供的引用内容: - 引用[1]定义了数据库系统的组成。 - 引用[2]讨论了数据库安全性。 - 引用[3]涉及SQL语句的功能。 用户的问题可能涉及数据库系统的使用错误或安全性问题。例如,权限设置不当导致数据泄露(引用[2]),或SQL语句使用错误(引用[3]中的CREATE、DROP误操作)。 接下来需构建回答框架: 1. 解释可能的“DAAN”含义,假设是数据库管理员或特定系统。 2. 分析常见数据库系统使用错误类型,结合引用内容。 3. 提供错误排查步骤。 4. 生成相关问题。 注意遵守系统指令,使用正确LaTeX格式,例如SQL语句中的关键字可用$...$包裹,如$SELECT$。同时确保回答结构清晰,引用标识正确添加。</think>关于“DAAN 数据库系统使用或错误”的问题,可能涉及数据库系统的操作、管理或安全性问题。以下是逐步分析: --- ### 一、DAAN 数据库系统的可能含义 1. **潜在拼写错误**:可能是“DBA”(Database Administrator,数据库管理员)的误写,DBA负责数据库系统的维护和优化[^1]。 2. **专有系统名称**:若DAAN是特定系统,需检查其文档或联系技术支持。 3. **术语混淆**:可能与数据库安全性(如权限错误)或SQL操作(如语法错误)相关[^2][^3]。 --- ### 二、常见数据库系统使用错误类型 1. **权限配置错误** - 未按最小权限原则分配用户权限,导致数据泄露或篡改[^2]。 - 示例:普通用户误获$DROP TABLE$权限,引发数据丢失。 2. **SQL语句错误** - 语法错误:如缺少分号、关键字拼写错误($SELEC * FROM table$)。 - 逻辑错误:查询条件错误导致结果不准确,如$WHERE x = 1 OR y = 2$未加括号。 3. **事务管理问题** - 未正确使用$BEGIN TRANSACTION$和$COMMIT$,导致数据不一致。 - 示例:事务未提交时中断,部分数据未持久化。 4. **性能问题** - 缺少索引:对频繁查询的字段未建立索引,如$CREATE INDEX idx_name ON table(column)$。 - 锁竞争:高并发场景下未合理设计事务隔离级别。 --- ### 三、错误排查步骤 1. **检查日志**:查看数据库日志(如MySQL的error.log)定位错误类型。 2. **验证权限**:执行$SHOW GRANTS FOR user@host$确认用户权限。 3. **测试SQL语句**:在开发环境逐段执行复杂查询,验证结果。 4. **性能分析**:使用$EXPLAIN$分析查询执行计划,优化慢查询。 --- ### 四、示例:修复权限错误 ```sql -- 错误:用户A误获删除权限 GRANT DELETE ON db.* TO 'userA'@'localhost'; -- 修正:撤销危险权限 REVOKE DELETE ON db.* FROM 'userA'@'localhost'; ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值