1、关于噪声z的维度大小和Generator输出样本个数的关系
在论文《Effective data generation for imbalanced learning using Conditional Generative Adversarial Networks》 中提到,噪声z的维度dz,以及G和D内部隐藏层的数量是超参数
GAN源代码是这样定义z的:
# 噪声z是一个随机变量,服从[0,1]的正态分布,维度为(图像的高度*隐层的维度)
z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim))))
其中,imgs.shape[0]经过验证为128,也就是batch_size的大小,而latent_dim是隐层的维度,在前面设置了默认值为100
numpy.random.normal(loc=0.0, scale=1.0, size=None)
其中参数loc为分布的均值,scale为分布的标准差
size为整数或者整数组成的元组,表示输出值的维度。如果给定的维度为(m, n, k)
,那么就从分布中抽取m * n * k
个样本。如果size为None(默认值)并且loc
和scale
均为标量,那么就会返回一个值。否则会返回np.broadcast(loc, scale).size
个值
在本例中,从服从[0,1]分布的随机数据中抽取了128*100=12800个样本作为噪声z,也就是说z只是一个数,不是向量,一共输入了12800个z
输出时的代码为:
batches_done = epoch * len(dataloader) + i
if batches_done % opt.sample_interval == 0:
save_image(gen_imgs.data[:25], "images/%d.png" % batches_done, nrow=5, normalize=True)
epoch=[0,100),len(dataloader)=469,i=[0,468)
所以batches_done=[0,1,2,……,46900]
opt.sample_interval为前面设置的图片间隔,等于400,因此每训练400张图片输出一次,46900/400=117…100,也就是说应该输出118次
文件夹里图片的序号为0,400,800,……,93600,共236张图片,也就是说输出了118的两倍,这是为什么呢?
不过可以确定的是,输出图片的数量与z的维度无关 !而与
这里通过讨论,搞明白了我一直以来困惑的一个点,就是对于这种输入为图片的神经网络,它的输入层维度(特征数)=图片的高*图片的宽
这也是为什么GAN能实现“降维”:原本我们训练样本图片为1*28*28,也就是说输入维度应该是784,但是当噪声z变为输入时,我们可以将维度从784降到100
在训练阶段,z的数量必须等于batch_size,等到训练好以后,需要使用Generator生成样本时,可以把128改成1000(比如需要生成1000个样本)
这里还有一点小疑问,为什么生成的样本数与输出层的参数无关?