Tensorflow 为了产生更大的图像,DCGAN发生器型号中有哪些数字

Tensorflow 为了产生更大的图像,DCGAN发生器型号中有哪些数字,tensorflow,machine-learning,keras,Tensorflow,Machine Learning,Keras,我确实在这里做了尽职调查,但我找不到很多关于为什么选择某些数字的文档。我还不清楚卷积在生成器中是如何工作的(更好地理解分类器),所以这对我的案例没有帮助。我想我的问题应该很简单,可以让大家有更多的经验 以Google的教程为例,Generator类: def make_generator_model(): model = tf.keras.Sequential() model.add(layers.Dense(7*7*256, use_bias=False, input_shap

我确实在这里做了尽职调查,但我找不到很多关于为什么选择某些数字的文档。我还不清楚卷积在生成器中是如何工作的(更好地理解分类器),所以这对我的案例没有帮助。我想我的问题应该很简单,可以让大家有更多的经验

以Google的教程为例,Generator类:

def make_generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Reshape((7, 7, 256)))
    assert model.output_shape == (None, 7, 7, 256) # Note: None is the batch size

    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
    assert model.output_shape == (None, 7, 7, 128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 14, 14, 64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    assert model.output_shape == (None, 28, 28, 1)

    return model
7x7x256从哪里来?我知道7x7是最终28x28大小的倍数,所以这在某种程度上是有道理的,但是256是什么呢?然后在下面的几层中,我注意到了一个模式,但我不确定如何重新编写它,使其适用于完全不同的图像大小。感谢您的帮助和指导,谢谢

编辑: 由于提供了有用的信息,我将gen更改为:

def make_generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(8*8*256, use_bias=False, input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Reshape((8, 8, 256)))
    assert model.output_shape == (None, 8, 8, 256) # Note: None is the batch size

    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
    assert model.output_shape == (None, 8, 8, 128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 16, 16, 64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(32, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 32, 32, 32)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(16, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 64, 64, 16)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(8, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 128, 128, 8)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(3, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    assert model.output_shape == (None, 256, 256, 3)

    return model
和鉴别器:

def make_discriminator_model():
    model = tf.keras.Sequential()
    model.add(layers.Conv2D(8, (5, 5), strides=(2, 2), padding='same',
                                     input_shape=[IMAGE_DIM[0], IMAGE_DIM[1], IMAGE_DIM[2]]))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))
    print(model.output_shape)

    model.add(layers.Conv2D(16, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))
    print(model.output_shape)

    model.add(layers.Conv2D(32, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))
    print(model.output_shape)

    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))
    print(model.output_shape)

    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))
    print(model.output_shape)

    model.add(layers.Conv2D(256, (5, 5), strides=(1, 1), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))
    print(model.output_shape)

    model.add(layers.Flatten())
    model.add(layers.Dense(1))
    #16384 65536
    return model

我发现很难很快总结出来。但它来了

DCGANS中的模型 DCGAN原型使用两个卷积神经网络作为鉴别器和生成器模型

鉴别器利用卷积从图像中提取信息,形成信息的层次结构。卷积的结果称为特征映射。在模型的更深处,卷积产生了表示图像中更抽象结构的特征映射

这个想法对DCGAN的功能至关重要,也是您在这些数字中看到模式的原因。请查看中的鉴别器模型,以了解这一点

你的模型 在我刚刚链接的DCGAN示例中,生成器与您的模型非常相似。从过于简单的意义上讲,DCGAN生成器从低维表示空间(称为潜在空间)创建样本

你可以看到这个模型几乎与鉴别器相反:图像是由低维张量(一种潜在空间向量)的转置卷积(简单地说,转置卷积是用于构建图像的卷积)形成的

号码是256 您询问的256号对应于生成器存储的要素贴图的数量,该数量随着模型的变化而减少

(7,7,256)
(7,7,128)
(14,14,64)
(28,28,1)
可以将其视为256个7×7特征映射,然后是128个7×7特征映射等。
conv2dtranpse
层的
strips
参数至关重要。如果该数字不等于1,则该层的图像输出大小与以前不同。列出的最后一个形状是这样的,因为它是由生成器创建的示例,而不是要素贴图的集合,因此编号为1

对于卷积中的跨步有一个很好的解释

为不同的图像重新编写 如果要将此模型用于不同大小的图像,则需要将一些初始小张量增大到正确的图像尺寸。模型层中的stride参数值显示了我上面列出的数字之间的相互关系

conv2dtranpse
层的
padding
参数也很关键。将其设置为
same
意味着图像中的每个像素都有一个卷积内核(对于一些与此相关的优秀图表)

在生成器模型中,对于每个卷积,保持
padding=相同是非常常见的。从本质上说,这意味着图像从该层的输入到输出保持相同的大小

我希望这是一些有用的信息。根据我自己的经验,测试像这样一个经过测试的模型的小偏差效果很好。
assert
语句将帮助您确保每个层正常工作