我试图了解对抗性生成网络的工作原理:我在FrançoisChollet的书(使用Python进行深度学习)中找到了一个示例,其中有一个他使用CIFAR10数据集的GAN示例,其中使用了“青蛙” '类,其中包含32x32 RGB图像。
我不明白为什么:
接下来,运行另一个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()
答案 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)您在Conv2DTranspose
或Conv2DTranspose
中设置的第一个参数是卷积层生成的过滤器的数量。
如前所述,跨距Conv2D
的使用恰好是按照与跨步数相等的系数对宽度和高度进行上采样。
其他3个Conv2DTranspose
也是任意的,您应该通过试验和对模型进行微调来确定它们。