BigGAN代码解读(gpt4.0的帮助)——谱正则化部分

作者个人记录学习

BigGAN中使用谱归一化对训练过程进行优化,在github中的代码中,使用了自己编写的谱归一化对卷积层、线性层以及Embedding层进行重写,下面对这部分重写进行解读。
代码网址:点赞最高的BigGAN代码

在这片代码中说自己是officially unoffcail,不是很理解

谱归一化代码如下(英文为原本注释,中文为作者后续理解注释):

# Spectral normalization base class
class SN(object):def __init__(self, num_svs, num_itrs, num_outputs, transpose=False, eps=1e-12):# Number of power iterations per step# 幂迭代的迭代次数,幂迭代用于估计特征值self.num_itrs = num_itrs# Number of singular values# 想要估计的特征值数量self.num_svs = num_svs# Transposed?self.transpose = transpose# Epsilon value for avoiding divide-by-0self.eps = eps# Register a singular vector for each svfor i in range(self.num_svs):# 缓冲区# 特征向量self.register_buffer('u%d' % i, torch.randn(1, num_outputs))# 特征值self.register_buffer('sv%d' % i, torch.ones(1))# Singular vectors (u side)# 保存特征向量@propertydef u(self):return [getattr(self, 'u%d' % i) for i in range(self.num_svs)]# Singular values;# note that these buffers are just for logging and are not used in training.# 保存特征值@propertydef sv(self):return [getattr(self, 'sv%d' % i) for i in range(self.num_svs)]# Compute the spectrally-normalized weightdef W_(self):W_mat = self.weight.view(self.weight.size(0), -1)if self.transpose:W_mat = W_mat.t()# Apply num_itrs power iterationsfor _ in range(self.num_itrs):svs, us, vs = power_iteration(W_mat, self.u, update=self.training, eps=self.eps) # Update the svsif self.training:with torch.no_grad(): # Make sure to do this in a no_grad() context or you'll get memory leaks!for i, sv in enumerate(svs):self.sv[i][:] = sv  # 返回谱归一化的权重矩阵,即原权重矩阵除以最大特征值的近似值return self.weight / svs[0]

这部分代码用于谱正则化,主要的函数W_首先计算权重矩阵的特征值的近似值,计算方法为幂迭代,之后使用原本的权重矩阵除以最大的特征值,并返回调整之后的权重矩阵。

重写的卷积层、线性层、Embedding层代码:

# 2D Conv layer with spectral norm
class SNConv2d(nn.Conv2d, SN):# 继承自nn.Conv2d, SNdef __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1, bias=True, num_svs=1, num_itrs=1, eps=1e-12):nn.Conv2d.__init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias)SN.__init__(self, num_svs, num_itrs, out_channels, eps=eps)    def forward(self, x):# self.W_()来源于谱归一化后的权重return F.conv2d(x, self.W_(), self.bias, self.stride, self.padding, self.dilation, self.groups)# 线性层和embedding层和卷积层一样
# Linear layer with spectral norm
class SNLinear(nn.Linear, SN):def __init__(self, in_features, out_features, bias=True,num_svs=1, num_itrs=1, eps=1e-12):nn.Linear.__init__(self, in_features, out_features, bias)SN.__init__(self, num_svs, num_itrs, out_features, eps=eps)def forward(self, x):return F.linear(x, self.W_(), self.bias)# Embedding layer with spectral norm
# We use num_embeddings as the dim instead of embedding_dim here
# for convenience sake
class SNEmbedding(nn.Embedding, SN):def __init__(self, num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False,sparse=False, _weight=None,num_svs=1, num_itrs=1, eps=1e-12):nn.Embedding.__init__(self, num_embeddings, embedding_dim, padding_idx,max_norm, norm_type, scale_grad_by_freq, sparse, _weight)SN.__init__(self, num_svs, num_itrs, num_embeddings, eps=eps)def forward(self, x):return F.embedding(x, self.W_())

以卷积层为例,新的卷积层继承了谱归一化类与原本的nn.Conv2d类,就是将nn.Conv2d中的self.weight权重矩阵经过SN的处理,返回的新权重矩阵,在forward函数中,同其他nn.Conv2d原本的参数,例如self.bias, self.stride,一同输入给F.conv2d,形成一个经过谱归一化的二维卷积,后面两个重写也为同理。

感谢gpt4.0帮我看懂。

BigGAN代码解读(gpt3.5的帮助)——谱正则化部分相关推荐

  1. BigGAN代码解读(gpt3.5帮助)——生成器部分

    代码来源于Github中点赞最多的BigGAN复现 作者个人学习记录 BigGAN的生成器代码内部引用了代码人员编写的谱正则化(SN)以及批正则化(BN),关于这部分的解读地址在这里: 批正则化 谱正 ...

  2. jsoup获得css,Jsoup代码解读之五-实现一个CSS Selector

    Jsoup代码解读之七-实现一个CSS Selector 当当当!终于来到了Jsoup的特色:CSS Selector部分.selector也是我写的爬虫框架webmagic开发的一个重点.附上一张s ...

  3. Jsoup代码解读之一-概述

    转载自   Jsoup代码解读之一-概述 今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了-觉得自己各种不靠谱啊!算了 ...

  4. VGAE(Variational graph auto-encoders)论文及代码解读

    一,论文来源 论文pdf Variational graph auto-encoders 论文代码 github代码 二,论文解读 理论部分参考: Variational Graph Auto-Enc ...

  5. 类ChatGPT逐行代码解读(2/2):从零起步实现ChatLLaMA和ColossalChat

    本文为<类ChatGPT逐行代码解读>系列的第二篇,上一篇是:如何从零起步实现Transformer.ChatGLM 本文两个模型的特点是加了RLHF 第六部分 LLaMA的RLHF版:C ...

  6. 200行代码解读TDEngine背后的定时器

    作者 | beyondma来源 | CSDN博客 导读:最近几周,本文作者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章出人意料地引起了巨大的反响,原以为C语言已经是昨日黄花,不过从读 ...

  7. 装逼一步到位!GauGAN代码解读来了

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:游璐颖,福州大学,Datawhale成员 AI神笔马良 如何装逼一 ...

  8. Unet论文解读代码解读

    论文地址:http://www.arxiv.org/pdf/1505.04597.pdf 论文解读 网络 架构: a.U-net建立在FCN的网络架构上,作者修改并扩大了这个网络框架,使其能够使用很少 ...

  9. Lossless Codec---APE代码解读系列(二)

    APE file 一些概念 APE代码解读系列(一) APE代码解读系列(三) 1. 先要了解APE compression level APE主要有5level, 分别是: CompressionL ...

最新文章

  1. Shell脚本编程01:基础知识
  2. 【arduino】玩CyberPi童芯派之真点灯,点亮板载RGB灯,GPIO扩展芯片AW9523B驱动
  3. leetcode 686. Repeated String Match | 686. 重复叠加字符串匹配(KMP)
  4. textjoin去重_SuperJoinText这个函数,弥补了TEXTJOIN的缺憾
  5. [html] 如何实现标题栏闪烁、滚动的效果
  6. 组合计数与反演 —— 反演
  7. 哈希表和红黑树的对比
  8. ES6学习(八)—Promise对象 超鸡重要
  9. 【读书心得】 高质量C++/C编程指南-林锐
  10. 计算机键盘操作指法 考试题,计算机键盘指法练习图计算机键盘指法练习介绍...
  11. android机器人聊天软件,虚拟男友聊天机器人
  12. [软件工程] 千帆竞发图的制作
  13. 如何删除“我的电脑”、“此电脑”中坚果云图标--三种方法(2020年的可行方案)
  14. 自定义控件之下拉刷新列表
  15. 使用 yarn 安装时,报错node_modules\node sass:Command failed.
  16. 120篇精华文章打包送,干货慎入!
  17. Fleaphp 数组辅助文件中 array_to_tree 的bug修正
  18. SpringBoot+Redis 实现一个微博热搜!
  19. Mac OSX系统下安装和删除程序
  20. Google Cloud的专业架构师和专业云工程师认证经验分享

热门文章

  1. lightning接口linux驱动,iPhone 8惊喜曝光:Lightning接口换USB Type-C
  2. Linux bc小数点前补0
  3. 【Unity开发】随手记:点击屏幕选中物体
  4. windows中如何给程序添加管理权限和添加数据保护(dep)
  5. 【前端】【html5/css3】前端学习之路(二)(CSS3新选择器/CSS3盒模型/CSS3过渡效果)
  6. 软件企业税收优惠政策2023
  7. 天翼云、移动云ubuntu服务器分区和磁盘挂载步骤
  8. 基于单片机的电铃控制器
  9. 同主机容器基于XDP的连通性实验
  10. H5学习之旅-H5的基本标签(2)