如何决定有多少卷积和反卷积应用于 GAN?
How to decide how many convolutions e deconvolutions apply to a GAN?
我试图了解对抗生成网络的工作原理:我在 François Chollet 的书中找到了一个例子(使用 Python 进行深度学习),其中有一个 GAN 的例子,他使用 CIFAR10数据集,使用包含 32x32 RGB 图像的 'frog' class。
我不明白为什么:
- 在(1)中输入被转化为16×16 128-channel(为什么是128-channel?)feature map
- 在(2)中进行卷积时,使用哪个过滤器?未指定
接下来,运行 另一个 Conv2DTranspose,然后是另一个 3 Conv2d。为什么?!
最后,我有一个32×32的1-channel feature map
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()
对于 1) 我认为没有理由使用密集节点的数量 (128x16x16),但是设置 16x16 是因为您只有 1 层可以将样本 16x16 提升到 32x32。
for 2) 用于实例化的第一个参数256
Conv2D
定义了过滤器的数量。
关于你的最后一个问题 Next, run another Conv2DTranspose and then another 3 Conv2d. Why?!
我建议尝试 increasing/decreasing 层数以了解模型如何随着这些变化而表现(表现更好与否),这是构建神经网络时“hyper-parameter tuning”过程的一部分。
希望以上内容对您有所帮助。
1)
这是一个任意选择,您可以为 Dense 层选择任意数量的通道。
16x16 被选中,因为 Conv2DTranspose
的步幅设置为 2,并且您想对宽度和高度进行上采样以获得 32x32 的输出。
步幅用于影响卷积层的输出大小。在普通卷积中,输出按与步幅相同的因子进行下采样,而在转置卷积中,它们按与步幅相同的因子进行上采样。
例如,您可以将第一层输出更改为 8x8x128,然后在 Conv2DTranspose
中使用步幅 4,这样您将在维度方面获得相同的结果。
还要记住,正如 François Chollet 在他的书中所说,当使用跨步转置卷积时,为了避免由像素 space 的不等覆盖引起的棋盘伪影,内核大小应该是可整除的通过它的步数。
2) 您在Conv2D
或Conv2DTranspose
中设置的第一个参数是卷积层生成的过滤器数量。
如前所述,跨步 Conv2DTranspose
恰好用于按等于步幅数的因子对宽度和高度进行上采样。
其他 3 个 Conv2D
也是任意的,您应该通过实验和微调模型来确定它们。
我试图了解对抗生成网络的工作原理:我在 François Chollet 的书中找到了一个例子(使用 Python 进行深度学习),其中有一个 GAN 的例子,他使用 CIFAR10数据集,使用包含 32x32 RGB 图像的 'frog' class。
我不明白为什么:
- 在(1)中输入被转化为16×16 128-channel(为什么是128-channel?)feature map
- 在(2)中进行卷积时,使用哪个过滤器?未指定
接下来,运行 另一个 Conv2DTranspose,然后是另一个 3 Conv2d。为什么?!
最后,我有一个32×32的1-channel feature map
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()
对于 1) 我认为没有理由使用密集节点的数量 (128x16x16),但是设置 16x16 是因为您只有 1 层可以将样本 16x16 提升到 32x32。
for 2) 用于实例化的第一个参数256
Conv2D
定义了过滤器的数量。
关于你的最后一个问题 Next, run another Conv2DTranspose and then another 3 Conv2d. Why?!
我建议尝试 increasing/decreasing 层数以了解模型如何随着这些变化而表现(表现更好与否),这是构建神经网络时“hyper-parameter tuning”过程的一部分。
希望以上内容对您有所帮助。
1) 这是一个任意选择,您可以为 Dense 层选择任意数量的通道。
16x16 被选中,因为 Conv2DTranspose
的步幅设置为 2,并且您想对宽度和高度进行上采样以获得 32x32 的输出。
步幅用于影响卷积层的输出大小。在普通卷积中,输出按与步幅相同的因子进行下采样,而在转置卷积中,它们按与步幅相同的因子进行上采样。
例如,您可以将第一层输出更改为 8x8x128,然后在 Conv2DTranspose
中使用步幅 4,这样您将在维度方面获得相同的结果。
还要记住,正如 François Chollet 在他的书中所说,当使用跨步转置卷积时,为了避免由像素 space 的不等覆盖引起的棋盘伪影,内核大小应该是可整除的通过它的步数。
2) 您在Conv2D
或Conv2DTranspose
中设置的第一个参数是卷积层生成的过滤器数量。
如前所述,跨步 Conv2DTranspose
恰好用于按等于步幅数的因子对宽度和高度进行上采样。
其他 3 个 Conv2D
也是任意的,您应该通过实验和微调模型来确定它们。