使用 Google 教程中的神经网络 https://www.tensorflow.org/tutorials/generation/dcgan
施工步骤
1)准备图像样本
2) 制作一个生成器(输入 - 许多神经元 (7x7x256),输出 - 1 张 28 x 28 灰度图像,从 -1 到 1)
3)我们制作了一个鉴别器——在输入端——一个灰度大小为 28 x 28 的图像,输出是一个判定数字,如果为 1,则图像 100% 为真,如果为 0,则图像肯定是假的。
4) 开始锻炼:
向发生器提供随机噪声
生成器生成图片
判别器看它是什么样的图片并呈现它的判决(比如说 0.1)
判别器查看完美图片并做出判断
我们计算生成器误差(它等于判别器对理想图片的正确答案(即1)与判别器如何估计我们的图片之间的交叉熵(0.1)
计算判别器误差(它等于 1 与判别器如何评价完美图片之间的交叉熵加上 0 与判别器如何评价错误图片之间的交叉熵)
应用这些错误来训练我们的模型
gradients_of_generator = gen_tape.gradient(gen_loss, createGenerator.trainable_variables)
gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)
generator_optimizer.apply_gradients(zip(gradients_of_generator, createGenerator.trainable_variables))
discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))
`
我们一遍又一遍地重复。
问题
1)我是否正确理解了生成对抗网络的算法?
2)为什么输入端的生成器有这么多第一神经元?为什么是 7x7x256?256 是 BATCH_SIZE,用于样品制备。但是为什么要乘以 7x7?
model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100, )))
3)每次在训练迭代中,输入噪声都会发生变化!而且不小心!在训练模型时,我们会为其添加基于误差的梯度,但如果输入数据一直是随机的,我们如何才能得到正确的答案?网络正常工作,经过 50 次迭代,数字看起来像数字,但为什么没有随机噪声干扰呢?
noise = random.normal([256, 100])
with GradientTape() as gen_tape, GradientTape() as disc_tape:
# получаем изображения от генератора изображений, передавая туда шум.
generated_images = createGenerator(noise, training=True)
```
我会试着回答你的一些问题。
BATCH_SIZE从白噪声创建图像,判别器计算生成器创建的BATCH_SIZE假图像和BATCH_SIZE真实图像的错误并总结错误。"Почему 7х7х256?"256 - 在这种情况下,它是第一层的深度。即使BATCH_SIZE我们这样做了,我们也不必改变输入张量的深度。选择第一层的维度,以便在输出处的所有展开层(反卷积/转置卷积)之后获得具有创建图像的张量的正确大小。那些。第一层的维度取决于生成图像的维度和扫描层的数量——层越多,维度应该在开始时越深。DCGAN 架构的另一个例子:
为简单起见,我们描述了一张图片的步骤。在实际情况下,这些将是具有附加维度的张量 -
batch_size,即 在网络/模型的一个步骤中处理的图像数量。发电机
4x4x10244x4x1024。在展开层之后,我们得到维度张量8x8x512,即 图片的尺寸增加了一倍,深度减少了一半。8x8x512-->16x16x25616x16x256-->32x32x128鉴别器
64x64x1,在输出的维度张量32x32x6432x32x64-->16x16x12816x16x128-->8x8x2568x8x256-->4x4x5124x4x512-->1(图片为真实的概率)因此,选择生成器的第一个扫描层的张量维度,以便在所有扫描层之后,获得所需维度的图像(在上述情况下 -
64x64x1)。