东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2777|回复: 0
打印 上一主题 下一主题

[课堂笔记] ArcFace loss(加性角度间隔损失)解惑:特征向量按行归一...

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14438
QQ
跳转到指定楼层
楼主
发表于 2020-6-5 17:01:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


# ArcFace loss(加性角度间隔损失)解惑:特征向量按行归一化,权重按列归一化
# ArcFace loss:Additive Angular Margin Loss(加性角度间隔损失函数),
# 对特征向量和权重归一化,对θ加上角度间隔m,角度间隔比余弦间隔在对角度的影响更加直接。
# 几何上有恒定的线性角度margin


# torch.nn.Parameter是继承自torch.Tensor的子类,其主要作用是作为nn.Module中的可训练参数使用。
# 它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,
# 即加入到parameter()这个迭代器中去;
# 而module中非nn.Parameter()的普通tensor是不在parameter中的。
# 注意到,nn.Parameter的对象的requires_grad属性的默认值是True,即是可被训练的,
# 这与torh.Tensor对象的默认值相反




  1. # -*- coding: utf-8 -*-
  2. __author__ = u'东方耀 微信:dfy_88888'
  3. __date__ = '2020/6/5 上午8:41'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'dfy_demo01'


  6. import torch
  7. import torch.nn.functional as F
  8. from torch.nn.parameter import Parameter
  9. import numpy as np
  10. import math
  11. import torch.nn as nn


  12. class dfy_model(nn.Module):
  13.     def __init__(self, in_feature, out_feature):
  14.         super(dfy_model, self).__init__()
  15.         print("自定义的模型:就一个简单的二维矩阵!")
  16.         # self.fc = nn.Linear(in_feature, out_feature, bias=False)
  17.         self.kernel = Parameter(torch.Tensor(in_feature, out_feature))
  18.         # initial kernel 初始化时就已经l2归一化了 这里是按列的
  19.         # self.kernel.data.uniform_(-1, 1).renorm_(p=2, dim=1, maxnorm=1e-5).mul_(1e5)
  20.         self.kernel.data.uniform_(-1, 1)
  21.         # pytorch在torch.nn.init中提供了常用的初始化方法函数
  22.         # torch.nn.init.eye_(self.kernel)   # 单位矩阵

  23.     def forward(self, x):
  24.         # for W in self.fc.parameters():
  25.         #     # 权重归一化 这样好像fc层的参数没有被归一化啊
  26.         #     # pytorch归一化fc层的参数
  27.         #     # 带out参数 不支持可微分的 differentiable
  28.         #     # F.normalize(W, p=2, dim=1, out=W)
  29.         #     W = F.normalize(W, p=2, dim=1)
  30.         kernel_norm = F.normalize(self.kernel, p=2, dim=0)
  31.         # 发现了:特征向量x的归一化(按行 dim=1)  权重矩阵的归一化(按列 dim=0)
  32.         x = F.normalize(x, p=2, dim=1)
  33.         # out2 = self.fc(x)

  34.         # out1:没有归一化weight
  35.         out1 = torch.mm(x, self.kernel)
  36.         # out2:  归一化weight
  37.         out2 = torch.mm(x, kernel_norm)

  38.         return out1, out2


  39. my_model = dfy_model(3, 10)
  40. embed = torch.from_numpy(np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32))

  41. print(embed.size(), embed)

  42. with torch.no_grad():
  43.     result1, result2 = my_model(embed)
  44.     print("没有归一化weight=", result1, result1.size())
  45.     print("归一化weight=", result2, result2.size())





复制代码


  1. from torch.nn.parameter import Parameter
  2. import torch

  3. kernel = Parameter(torch.Tensor(2, 3))
  4. kernel.data.uniform_(-1, 1).renorm_(p=2, dim=1, maxnorm=1e-5).mul_(1e5)

  5. print(kernel)
  6. kernel = torch.nn.functional.normalize(kernel, p=2, dim=0)
  7. print(kernel)
  8. # 输出的值是一样的
  9. # tensor([[-0.7415, -0.2698,  0.9620],
  10. #         [ 0.6709,  0.9629,  0.2729]], requires_grad=True)
  11. # tensor([[-0.7415, -0.2698,  0.9620],
  12. #         [ 0.6709,  0.9629,  0.2729]], grad_fn=<DivBackward0>)

复制代码





让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-6 21:18 , Processed in 0.177149 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表