ArcFace Notes

Framework: Pytorch 0.3.0

关于pytorch 反传计算图一点小心得:

  • 计算图记录了variable的所有操作。若需要此变量反向求导,则一开始参与计算时该以variable出现。

  • 直接改动variable下的tensor(即variable.data),则其改动在反传中无效。

  • 计算时最好进行矩阵整体运算,单独对矩阵中某些数值进行改动,计算图代价很大。
    如,我们的目标是将Mat(cos_\theta)j=label处替换成phi_\theta
    如下代码,如果对phi_theta[i,j]进行单独操作,由于公式1中的cos_theta[i,j]是variable。因此,在计算图中,矩阵中的每个元素都得单独反传。

      for i in range(cos_theta.shape[0]):
          j=target[i].data[0]
          if cos_theta[i,j].data[0] >= -self.cosm:
              phi_theta[i,j]=self.cosm * cos_theta[i,j] - \
                           self.sinm * torch.sqrt(1e-6+1-cos_theta[i,j]*cos_theta[i,j]) #公式1
          else:
              phi_theta[i,j] = cos_theta[i,j]
    

将代码改成

    for i in range(cos_theta.shape[0]):
        j=target[i].data[0]
        if cos_theta[i,j].data[0] >= -self.cosm:
            flagMat[i,j]= 1
        else:
            flagMat[i,j] = 0
    flagMat=Variable(flagMat)
    phi_theta=(self.cosm * cos_theta - self.sinm * torch.sqrt(1e-6+1-cos_theta*cos_theta))*flagMat\
              +(1-flagMat)*cos_theta

新构造指示矩阵flatMat公式1进行运算,且flatMat不参与反传,得到的phi_\theta.grad_fn公式1backward,计算图恢复正常!life will be better!

Reference

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,427评论 0 2
  • 算法和数据结构 [TOC] 算法 函数的增长 渐近记号 用来描述算法渐近运行时间的记号,根据定义域为自然数集$N=...
    wxainn阅读 1,093评论 0 0
  • 转载-刘建平Pinard-www.cnblogs.com/pinard/p/5970503.html 在求解机器学...
    商三郎阅读 3,533评论 0 2
  • 生活,不能如一潭死水。一潭死水表面易布满人见人恨的蚊蝇,臭气熏天的臭水沟,龌龊的花脚蚊虫和恶心的绿头苍蝇惺惺相惜,...
    碧海青天2017阅读 242评论 0 1
  • 有时候Xcode就会犯病,你的做法就是重新搞一遍就好了。它的错误很难找出来。
    frankisbaby阅读 252评论 0 0