欢迎光临散文网 会员登陆 & 注册

nvidia StyleGAN 结构详解

2020-05-08 23:14 作者:nyasyamorina  | 我要投稿

置顶: 原版StyleGAN里有很多自定义参数, 为了方便这里只讲述默认结构

并且在源码里有部分地方结构不太人性化, 这里为了更直观地表达, 会调整部分结构, 但实际上与源码的效果是一致的

相关操作:

在StyleGAN里(包括判别器), 特征图的通道数量与特征图大小直接挂钩, 默认计算公式如下:  (注: 特征图大小必定为2的整数次方的正方形, 其中nf是通道数, res是特征图边长)

并且大量使用一个叫"blur"的模糊化操作, blur是利用一个卷积核在每个通道上做卷积操作, 这不同与平常的卷积, 在所有通道上做卷积操作, 注意blur不影响特征图的大小, 也就是说需要在特征图上pad一圈0再卷积

星号是数学上的卷积

在生成器里有一个叫上采样的操作, 它其实类似与平均池化的反操作, 同理, 另外一个叫下采样的操作就是平均池化了

StylaGAN全程使用leaky_relu作为激活函数act, 但内部使用激活函数的频率比一般情况要少, 所以激活函数也会另外标注, leakyReLU计算:

另外, biasact也会单独标注, 没写的就是没有

StyleGAN里共计3个神经网络, G_mapping, G_synthesis判别器D, 首先先从判别器D开始:

D的结构可以表示为这样:

其中Block的结构为:

至于中间的MinibatchStddev, 维度变换过于抽象, 这里直接贴代码吧

其实就是根据输入x生成多一张特征图

主生成器G_style: 内部有两个独立的神经网络: G_mappingG_synthesis, 外部输入在G_mapping, 经处理后再作为G_synthesis旁路输入得到图像输出, 结构就像官方论文给出那样

其中G_mapping为简单的MLP: (N, 512) 输入, 经过pixel_norm, 再通过8次有bias和act的FC, 输出(N, 512), pixel_norm计算如下: 

为了避免/0, 会在下面加上一个极小值ε

而在G_synthesis里, 可以分为一个一个block, 而block可以分为上半部分和下半部分, 而每部分又可以分为convlayer_epilogue, 由于两部分的conv有丶不同, 所以上半部分叫做conv0, 下半部分叫conv1, 其中第一块block没有conv0, 并且G_synthesis的输入为形状为(N, 512, 4, 4), 全部都是1.0的数组 

conv0:

这里Conv2d没有bias和act, nf就是上面提到的nf

conv1就是简单一个没有bias和act的Conv2d

layer_epilogue是StyleGAN的重点, 而layer_epilogue又分成2部分, 流程如下:

其中instance_norm是先减去均值再进行pixel_norm, 具体表示如下:

Add noise计算过程如下:  其中noise是符合正态分布的随机数组

在写代码时为了避免歧义, 应该有: noise.shape=(N,1,H,W), weight.shape=bais.shape=(1,C,1,1), x += noise*weight+bias

StyleMod的另一个输入w为G_mapping的输出,  w经过一个有bias的FC后, 得到长度为2*C的数组, 而数组的前半部分作为weight, 后半部分作为bias加入到x里, 流程如下:

结语: 我至今不知道怎么在tf里搞权重到np.ndarray

nvidia StyleGAN 结构详解的评论 (共 条)

分享到微博请遵守国家法律