如何确定将多少个卷积和反卷积应用于GAN?

时间:2019-05-31 09:29:59

标签: machine-learning deep-learning artificial-intelligence generative-adversarial-network

我试图了解对抗性生成网络的工作原理:我在FrançoisChollet的书(使用Python进行深度学习)中找到了一个示例,其中有一个他使用CIFAR10数据集的GAN示例,其中使用了“青蛙” '类,其中包含32x32 RGB图像。

我不明白为什么:

  • 在(1)中,输入被转换为16×16 128通道(为什么要使用128通道?)特征图
  • 在(2)中,当执行卷积时,使用哪个过滤器?未指定

接下来,运行另一个Conv2DTranspose,然后运行另一个3 Conv2d。为什么?!

最后,我有一个32×32的1通道特征图。

from keras import layers
import numpy as np
latent_dim = 32
height = 32
width = 32
channels = 3

generator_input = keras.Input(shape=(latent_dim,))

(1)
x = layers.Dense(128 * 16 * 16)(generator_input)
x = layers.LeakyReLU()(x)
x = layers.Reshape((16, 16, 128))(x)

(2)
x = layers.Conv2D(256, 5, padding='same')(x)
x = layers.LeakyReLU()(x)

x = layers.Conv2DTranspose(256, 4, strides=2, padding='same')(x)
x = layers.LeakyReLU()(x)

x = layers.Conv2D(256, 5, padding='same')(x)
x = layers.LeakyReLU()(x)
x = layers.Conv2D(256, 5, padding='same')(x)
x = layers.LeakyReLU()(x)

x = layers.Conv2D(channels, 7, activation='tanh', padding='same')(x)
generator = keras.models.Model(generator_input, x)
generator.summary()

2 个答案:

答案 0 :(得分:1)

对于1)我不认为使用密集节点的数量(128x16x16)是有原因的,但是设置16x16是因为您只有一层可以将样本16x16增加到32x32。

对于2)用于实例化Conv2D的第一个参数256定义了过滤器的数量。

关于您的最后一个问题Next, run another Conv2DTranspose and then another 3 Conv2d. Why?!,我建议您尝试增加/减少层数,以了解模型在这些更改下的行为方式(表现得更好与否),这是“建立神经网络时的hyper-parameter tuning”过程。

希望以上帮助。

答案 1 :(得分:1)

1) 这是一个任意选择,您可以为“密集”层选择任意数量的通道。

选择16x16,因为将跨步2设置为@Retention(RetentionPolicy.RUNTIME),并且您想对宽度和高度进行上采样以获得32x32的输出。

步幅用于影响卷积层的输出大小。在普通卷积中,输出的采样率与步幅相同,而在转置卷积中,输出的采样率与步幅相同。

例如,您可以将第一层输出更改为8x8x128,然后在@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Command { String command(); String name(); String desc() default ""; String[] aliases() default {}; boolean admin() default true; } 中使用4的步幅,这样就可以在尺寸方面获得相同的结果。

还要记住,正如FrançoisChollet在他的书中所述,在使用分步转置卷积时,为了避免由于像素空间覆盖率不相等而引起的棋盘伪像,内核大小应被其步幅数整除。

2)您在Conv2DTransposeConv2DTranspose中设置的第一个参数是卷积层生成的过滤器的数量。

如前所述,跨距Conv2D的使用恰好是按照与跨步数相等的系数对宽度和高度进行上采样。

其他3个Conv2DTranspose也是任意的,您应该通过试验和对模型进行微调来确定它们。