【人工智能概论】 Python标准库——dalib(领域自适应)

【人工智能概论】 Python标准库——dalib(领域自适应)


一. 领域鉴别器(DomainDiscriminator)

dalib.modules.domain_discriminator.DomainDiscriminator(in_feature: int, hidden_size: int)

  • 功能: 区分输入的特征是来自源域还是目标域,源域标签为1,目标域标签为0。
  • 参数:
  • in_feature(int): 输入特征的维度;
  • hidden_size(int): 隐层特征的维度。
  • 形状:
  • inputs:(minibatch, in_feature);
  • outputs: (minibatch, 1)。
  • 举例:
  • 见 领域对抗损失(DomainAdversarialLoss) 的举例。

二. 领域对抗损失(DomainAdversarialLoss)

dalib.adaptation.dann.DomainAdversarialLoss(domain_discriminator: torch.nn.modules.module.Module, reduction: Optional[str]= 'mean')

  • 定义: L o s s ( D s , D t ) = E x i s ⌢ D s l o g [ D ( f i s ) ] + E x j t ⌢ D t l o g [ 1 − D ( f j t ) ] Loss(D_{s},D_{t})=E_{x_{i}^{s}\frown D_{s}}log[D(f_{i}^{s})]+E_{x_{j}^{t}\frown D_{t}}log[1-D(f_{j}^{t})] Loss(Ds,Dt)=ExisDslog[D(fis)]+ExjtDtlog[1D(fjt)]其中,D是领域鉴别器,f是领域的特征。
  • 参数:
  • domain_discriminator(nn.Module) : 域鉴别器对象,用于预测特征的域;
  • reduction(string,Optional) : 指定输出损失的方式,‘none’, ‘sum’,‘mean’,其中’none’指不使用任何降维直接输出,‘sum’、'mean’分别是对损失求和、求均值,默认为求均值。
  • 输入:
  • f_s (tensor):源域的特征 f s f^{s} fs
  • f_t (tensor) :目标域的特征 f t f^{t} ft
  • 形状:
  • f_s, f_t : (N, F)F是输入特征的维度;
  • outputs : 默认是标量,但如果reduction是’none’输出的形状是(N,)。
  • 举例:
from dalib.modules.domain_discriminator import DomainDiscriminator
from dalib.adaptation.dann import DomainAdversarialLoss

discriminator = DomainDiscriminator(in_feature= 1024, hidden_size= 2048)
loss = DomainAdversarialLoss(discriminator, reduction= 'mean')

f_s, f_t = torch.rand(20, 1024), torch.rand(20, 1024)
output = loss(f_s, f_t)

print(output)

在这里插入图片描述

三. 高斯核(GaussianKernel)

dalib.modules.kernels.GaussianKernel(sigma: Optional[float] = None, track_running_stats: Optional[bool] = True, alpha: Optional[float] = 1.0)

  • 定义:
  • 高斯核 k k k的定义: k ( x 1 , x 2 ) = e x p ( − ∥ x 1 − x 2 ∥ 2 2 σ 2 ) k(x_{1},x_{2})=exp(-\frac{\left \| x_{1}-x_{2} \right \|^{2} }{2\sigma ^{2}} ) k(x1,x2)=exp(2σ2x1x22) 其中 x 1 , x 2 ∈ R d x_{1},x_{2}\in R^{d} x1,x2Rd是一维张量。
  • 高斯核矩阵 K K K被定义在 X = ( x 1 , x 2 , . . . x m ) X=(x_{1},x_{2},...x_{m}) X=(x1,x2,...xm)上: K ( x ) i , j = k ( x i , x j ) K(x)_{i,j} = k(x_{i},x_{j}) K(x)i,j=k(xi,xj)
  • 在运算中 σ 2 \sigma ^{2} σ2有两种确认方法:
    第一种通过下式计算动态获得: σ 2 = α n 2 ∑ i , j ∥ x i − x j ∥ 2 \sigma ^{2} = \frac{\alpha }{n^{2}}\sum _{i,j}\left \| x_{i}-x_{j} \right \| ^{2} σ2=n2αi,jxixj2
    第二种是直接给定数值。
  • 参数:
  • sigma(float, optional): 即 σ \sigma σ,默认为None;
  • track_running_stats(bool, optional):如果是’True’则用前面的公式计算 σ 2 \sigma^{2} σ2,若为’False’则使用固定的 σ 2 \sigma^{2} σ2,默认为’True’;
  • alpha(float, optional):当track_running_stats为’True’时为计算 σ 2 \sigma^{2} σ2提供 α \alpha α
  • 输入:
  • X(tensor):输入组X。
  • 形状:
  • inputs:(minibatch, F) , F是输入特征的维数;
  • outputs:(minibatch, minibatch) 。

四. 多核最大均值差异(MK-MMD)

dalib.adaptation.dan.MultipleKernelMaximumMeanDiscrepancy(kernels: Sequence[torch.nn.modules.module.Module], Linear: Optional[bool]= False, quadratic_program: Optional[bool]= False)

  • MK-MMD:
  • 源域为: D s = { ( x i s , y i s ) } i = 1 n s D_{s}= \left \{ (x_{i}^{s},y_{i}^{s}) \right \}_{i=1}^{n_{s}} Ds={(xis,yis)}i=1ns
  • 目标域: D t = { x j t } j = 1 n t D_{t}= \left \{ x_{j}^{t} \right \}_{j=1}^{n_{t}} Dt={xjt}j=1nt
  • 它们各自的样本间都符合独立同分布;
  • 则MK-MMD的计算公式为: d M K − M M D ( D s , D t ) = ∥ E s [ g ( D s ) ] − E t [ g ( D t ) ] ∥ H k 2 d_{MK-MMD}(D_{s},D_{t})=\left \| E_{s}[g(D_{s})]-E_{t}[g(D_{t})] \right \| ^{2}_{H_{k}} dMKMMD(Ds,Dt)=Es[g(Ds)]Et[g(Dt)]Hk2
  • H k H_{k} Hk表示具有特定内核 k k k R K H S RKHS RKHS g ( ∗ ) g(*) g()是与核函数相关的连续映射, E [ ∗ ] E[*] E[]是给定分布的期望;
  • 应当注意的是,核函数 k k k是被定义为 r r r个不同的半正定核的凸组合,如下形式: k ( x s , x t ) = ∑ i = 1 r β i k i ( x s , x t ) k(x^{s},x^{t})= {\textstyle \sum_{i=1}^{r}}\beta _{i}k_{i}(x^{s},x^{t}) k(xs,xt)=i=1rβiki(xs,xt)
  • 其中: ∑ i r β i = 1 , β i ≥ 0 {\textstyle \sum_{i}^{r}}\beta _{i}=1,\beta _{i}\ge 0 irβi=1,βi0
  • 所谓半正定性是核函数的常见的性质(可以联系SVM中的相关概念学习),凸组合是一种线性组合,若满足 λ i ≥ 0 , ∑ i r λ i = 1 \lambda _{i}\ge 0,{\textstyle \sum_{i}^{r}}\lambda _{i}=1 λi0irλi=1 ∑ i r λ i x i {\textstyle \sum_{i}^{r}}\lambda _{i}x_{i} irλixi即为凸组合;
  • 使用内核技巧,MK-MMD可以简化计算为: D ^ k ( D s , D t ) = 1 n s 2 ∑ i = 1 n s ∑ j = 1 n s k ( D s i , D s j ) + 1 n t 2 ∑ i = 1 n t ∑ j = 1 n t k ( D t i , D t j ) − 2 n s n t ∑ i = 1 n s ∑ j = 1 n t k ( D s i , D t j ) \hat{D}_{k}(D_{s},D_{t})= \frac{1}{n_{s}^{2}} {\textstyle \sum_{i=1}^{n_{s}}} {\textstyle \sum_{j=1}^{n_{s}}} k(D_{s}^{i},D_{s}^{j}) +\frac{1}{n_{t}^{2}} {\textstyle \sum_{i=1}^{n_{t}}} {\textstyle \sum_{j=1}^{n_{t}}} k(D_{t}^{i},D_{t}^{j}) -\frac{2}{n_{s}n_{t}} {\textstyle \sum_{i=1}^{n_{s}}} {\textstyle \sum_{j=1}^{n_{t}}} k(D_{s}^{i},D_{t}^{j}) D^k(Ds,Dt)=ns21i=1nsj=1nsk(Dsi,Dsj)+nt21i=1ntj=1ntk(Dti,Dtj)nsnt2i=1nsj=1ntk(Dsi,Dtj)
  • 参数:
  • Kernel(tuple(nn.Module)): 核方程;
  • Linear(bool):是否使用DAN的线性版本,默认不用;
  • quadratic_program(bool): 是否使用二次规划求解 β \beta β,默认不用。
  • 输入:
  • d_s(tensor):源域通过映射所得的特征 D s D_{s} Ds
  • d_t(tensor): 目标域通过映射所得的特征 D t D_{t} Dt
  • 注意它俩必须相同的形状。
  • 形状:
  • inputs: (minibatch, *) *代表任意数,实际上就是传入的特征维度;
  • outputs: 标量。
  • 举例:
from dalib.modules.kernels import GaussianKernel
from dalib.adaptation.dan import MultipleKernelMaximumMeanDiscrepancy

feature_dim = 1024
batch_size = 10

kernels = (GaussianKernel(alpha=0.5), GaussianKernel(alpha=1.), GaussianKernel(alpha=2.))
loss = MultipleKernelMaximumMeanDiscrepancy(kernels)

# features from source domain and target domain
z_s, z_t = torch.randn(batch_size, feature_dim), torch.randn(batch_size,feature_dim)
output = loss(z_s, z_t)

print(output)

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值