nvidia StyleGAN 结构详解
置顶: 原版StyleGAN里有很多自定义参数, 为了方便这里只讲述默认结构
并且在源码里有部分地方结构不太人性化, 这里为了更直观地表达, 会调整部分结构, 但实际上与源码的效果是一致的

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

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

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

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

另外, bias和act也会单独标注, 没写的就是没有

StyleGAN里共计3个神经网络, G_mapping, G_synthesis和判别器D, 首先先从判别器D开始:
D的结构可以表示为这样:

其中Block的结构为:

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

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

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

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

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

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