用GAN生成正态分布
毕设中有一部分与GAN(Generative Adversarial Networks)相关,但是一直不work,因此准备重新从最简单的GAN入手,实现一下试试看能不能发现什么问题。
本文会用GAN从标准正态噪声生成均值为3.5,标准差为0.7的正态分布 N ( 3.5 , 0. 7 2 ) N(3.5, 0.7^2) N(3.5,0.72)。
整体结构
一个GAN由生成器Generator(G)和判别器Discriminator(D)构成,D希望能正确分辨真实样本和G生成的假样本,G希望能骗过D,让D认为G生成的样本是真的。根据GAN的不同,G和D的目标函数有所不同,结构和连接方式也各有不同,G与D内部的结构也比较自由(姑且这么认为,实际上还是需要小心设计的)。
下图是一个原始GAN的结构。 z z z是一个 d d d维的噪声向量, x x x是从目标分布 N ( 3 , 0. 5 2 ) N(3, 0.5^2) N(3,0.52) 中采样得到的样本,即真实样本,也是一个 d d d维向量。

生成器与判别器
由于任务比较简单,只是随机向量到随机向量,所以G和D的结构只使用MLP。方便起见,令随机向量维度 d = 10 d=10 d=10。
# 生成器
class Generator_MLP(BasicBlock):
def __init__(self, name=None):
super(Generator_MLP, self).__init__(None, name or "Generator_MLP")
def __call__(self, z, is_training=True, reuse=False):
with tf.variable_scope(self.name, reuse=reuse):
net = tf.nn.softplus(dense(z, 64, name='g_fc1'))
out = dense(net, 10, name='g_fc2')
return out
# 判别器
class Discriminator_MLP(BasicBlock):
def __init__(self, name=None):
super(Discriminator_MLP, self).__init__(None, name or "Discriminator_MLP")
def __call__