当前位置: 首页 > news >正文

网站设计页面如何做居中丢盖网logo在线设计

网站设计页面如何做居中,丢盖网logo在线设计,wordpress联系表单发生错误,上海网站快速排名AIGC实战——生成对抗网络 0. 前言1. 生成对抗网络1.1 生成对抗网络核心思想1.2 深度卷积生成对抗网络 2. 数据集分析3. 构建深度卷积生成对抗网络3.1 判别器3.2 生成器3.3 DCGAN 模型训练 4. GAN 训练技巧4.1 判别器强于生成器4.2 生成器强于判别器4.3 信息量不足4.4 超参数 小… AIGC实战——生成对抗网络 0. 前言1. 生成对抗网络1.1 生成对抗网络核心思想1.2 深度卷积生成对抗网络 2. 数据集分析3. 构建深度卷积生成对抗网络3.1 判别器3.2 生成器3.3 DCGAN 模型训练 4. GAN 训练技巧4.1 判别器强于生成器4.2 生成器强于判别器4.3 信息量不足4.4 超参数 小结系列链接 0. 前言 生成对抗网络 (Generative Adversarial Network, GAN) 是由 Ian Goodfellow 等人在 2014 年提出的一种强大的深度学习模型可以用于生成新数据样本比如图像、音频、文本等。GAN 包含两个神经网络生成器和判别器。生成器根据输入的噪声信号生成一些伪造的数据样本而判别器则负责判断该数据样本是真实的还是伪造的。在本节中首先阐述生成对抗网络的理论基础然后使用 Keras 构建生成对抗网络模型。 1. 生成对抗网络 1.1 生成对抗网络核心思想 生成对抗网络 (Generative Adversarial NetworkGAN) 可以通过类比为一个伪造专家与一个检测专家之间的博弈。生成器 (generator) 是伪造专家目标是制造出逼真的假样本以尽可能地欺骗检测专家。而鉴别器 (discriminator) 则是检测专家旨在区分真实样本和生成器产生的假样本并尽可能准确地识别它们。 在开始时生成器只能制造出不完美的假样本而鉴别器擅长辨别真伪并且准确率相对较高。然而随着训练的进行生成器变得更加熟练并努力提高自己的技艺从而创造逼真的样本。同时鉴别器也在不断学习和调整自己的判别能力以保持对假样本的敏感度。 通过反复的博弈和训练生成器和鉴别器逐渐达到一种平衡状态。生成器学会了创造足以迷惑鉴别器的逼真作品而鉴别器也不断提高自己的判别能力。最终生成器能够创造出几乎无法与真实样本区分的逼真假样本而鉴别器也变得越来越难以区分真伪。 GAN 的核心思想是生成器和判别器之间的对抗生成器试图将随机噪声转换为看起来像是从原始数据集中采样而来的观测样本而判别器则试图预测一个观测样本是来自原始数据集还是生成器的伪造品。下图展示了生成器与判别器的输入和输出的示例。 在开始时生成器会输出充满噪声的图片同样判别器的预测也是随机的。GAN 的关键在于交替训练这两个网络才能让生成器越来越擅长欺骗判别器而判别器必须通过训练保证其正确识别真伪的能力这又会驱使生成器找到欺骗判别器的新方法从而推动循环不断向前进行。 1.2 深度卷积生成对抗网络 为了更深入了解生成对抗网络的训练流程我们将使用 Keras 构建深度卷积生成对抗网络 (Deep Convolutional GAN, DCGAN)来生成积木的图片。GAN 的原论文中没有使用卷积层而是使用了全连接层但实践已经证明卷积层能够提供更强大的性能因此现在基本上所有的 GAN 架构都包含卷积层。 2. 数据集分析 首先需要下载训练数据使用 Kaggle 上的乐高积木图像数据集。该数据集中包含了 40,000 张不同角度的 50 种不同玩具积木的照片示例样本图片如下所示 可以通过 Kaggle 官方网站下载数据集下载完成后将这些图像和相关的元数据保存到 ./data 文件夹中。 使用 Keras 的 image_dataset_from_directory 函数来创建一个指向存储图像目录的 TensorFlow 数据集以便可以在需要时(例如在训练期间)将图像批量读入内存从而能够处理大型数据集而无需担心将整个数据集都放入内存中导致内存不足的情况。同时将图像尺寸调整为 64 × 64并在像素值之间进行插值处理 train_data image_dataset_from_directory(data/lego_brick,label_modeNone,color_modegrayscale,image_size(IMAGE_SIZE, IMAGE_SIZE),batch_sizeBATCH_SIZE,shuffleTrue,interpolationbilinear, )原始数据的像素强度范围为 [0, 255]。在训练 GAN 时我们将数据缩放到范围 [-1, 1]以便在生成器的最后一层使用 tanh 激活函数。相对于 sigmoid 函数tanh 激活函数的梯度更大有助于更快地收敛 def preprocess(img):Normalize and reshape the imagesimg (tf.cast(img, float32) - 127.5) / 127.5return imgtrain train_data.map(lambda x: preprocess(x)).as_numpy_iterator()3. 构建深度卷积生成对抗网络 3.1 判别器 鉴别器的目标是预测图像是真实的还是伪造的这属于图像分类问题因此我们可以使用常见的深度神经网络架构即先堆叠的卷积层最后使用带有一个输出节点的全连接层。判别器的完整架构如下 使用 Keras 实现判别器 # 定义判别器的输入(图像)层 discriminator_input layers.Input(shape(IMAGE_SIZE, IMAGE_SIZE, CHANNELS)) # 堆叠 Conv2D 层并在其间添加 BatchNormalization、LeakyReLU 激活和 Dropout 层 x layers.Conv2D(64, kernel_size4, strides2, paddingsame, use_biasFalse)(discriminator_input ) x layers.LeakyReLU(0.2)(x) x layers.Dropout(0.3)(x) x layers.Conv2D(128, kernel_size4, strides2, paddingsame, use_biasFalse )(x) x layers.BatchNormalization(momentum0.9)(x) x layers.LeakyReLU(0.2)(x) x layers.Dropout(0.3)(x) x layers.Conv2D(256, kernel_size4, strides2, paddingsame, use_biasFalse )(x) x layers.BatchNormalization(momentum0.9)(x) x layers.LeakyReLU(0.2)(x) x layers.Dropout(0.3)(x) x layers.Conv2D(512, kernel_size4, strides2, paddingsame, use_biasFalse )(x) x layers.BatchNormalization(momentum0.9)(x) x layers.LeakyReLU(0.2)(x) x layers.Dropout(0.3)(x) x layers.Conv2D(1,kernel_size4,strides1,paddingvalid,use_biasFalse,activationsigmoid, )(x) # 将最后一个卷积层展平得到张量的形状为 1×1×1因此不再需要 Dense 层 discriminator_output layers.Flatten()(x) # 定义判别器模型该模型接受一个输入图像并输出一个介于 0 和 1 之间的概率值 discriminator models.Model(discriminator_input, discriminator_output) print(discriminator.summary())需要注意的是为了缩小张量在网络中传递时的空间形状(从原始图像的 64 开始然后是 32、16、8、4最后是 1)某些 Conv2D 层的步幅为 2同时增加通道数(灰度输入图像中通道数为 1然后变为 64、128、256最后为 512)最后展平为单个预测值。 在最后一个 Conv2D 层上使用 sigmoid 激活函数以确保输出值介于 0 和 1 之间表示预测图像为真的概率。 3.2 生成器 接下来构建生成器。生成器的输入是从多元标准正态分布中抽取的向量输出是与原始训练数据中的图像大小相同的图像。GAN 的生成器和变分自编码器 (Variational Autoencoder, VAE) 的解码器具有完全相同的目标将潜空间中的向量转换为图像。在生成模型中从潜空间映射回原始域的概念非常常见因为通过这个概念我们能够在潜空间中操作向量以改变原始域中图像的高级特征。生成器架构如下所示 使用 Keras 实现以上生成器模型 # 定义生成器的输入层长度为 100 的随机向量 generator_input layers.Input(shape(Z_DIM,)) # 使用 Reshape 层将输入向量转化为 1×1×100 的张量以便应用转置卷积操作 x layers.Reshape((1, 1, Z_DIM))(generator_input) # 堆叠四个 Conv2DTranspose 层并在其间添加 BatchNormalization 和 LeakyReLU 层 x layers.Conv2DTranspose(512, kernel_size4, strides1, paddingvalid, use_biasFalse )(x) x layers.BatchNormalization(momentum0.9)(x) x layers.LeakyReLU(0.2)(x) x layers.Conv2DTranspose(256, kernel_size4, strides2, paddingsame, use_biasFalse )(x) x layers.BatchNormalization(momentum0.9)(x) x layers.LeakyReLU(0.2)(x) x layers.Conv2DTranspose(128, kernel_size4, strides2, paddingsame, use_biasFalse )(x) x layers.BatchNormalization(momentum0.9)(x) x layers.LeakyReLU(0.2)(x) x layers.Conv2DTranspose(64, kernel_size4, strides2, paddingsame, use_biasFalse )(x) x layers.BatchNormalization(momentum0.9)(x) x layers.LeakyReLU(0.2)(x) # 最后一个 Conv2DTranspose 层使用 tanh 激活函数将输出转换到区间 [-1, 1]以匹配原始图像域 generator_output layers.Conv2DTranspose(CHANNELS,kernel_size4,strides2,paddingsame,use_biasFalse,activationtanh, )(x) # 定义生成器模型其接受长度为100的向量并输出形状为 [64, 64, 1] 的张量 generator models.Model(generator_input, generator_output) print(generator.summary())需要注意的是为了增加张量在网络中传递时的空间形状(原始向量中为 1然后是 4、8、16、32最后是 64)某些 Conv2DTranspose 层的步幅为 2同时减少通道数(首先是 512然后是 256、128、64最后是 1以匹配灰度图像输出)。 UpSampling2D 与 Conv2DTranspose 除了使用 Conv2DTranspose 层来增加图像尺寸外还可以使用 UpSampling2D 层并在 UpSampling2D 后添加一个步幅为 1 的普通 Conv2D 层 x layers.UpSampling2D(size 2)(x) x layers.Conv2D(256, kernel_size4, strides1, paddingsame)(x)UpSampling2D 层简单地将输入的每一行和每一列重复用以将张量的宽度和高度加倍。然后利用步幅为 1 的 Conv2D 层执行卷积操作。这种方法与转置卷积类似但不同的是上采样只是重复现有的像素值而不是用零填充像素之间的空隙。 实践证明Conv2DTranspose 方法会导致输出图像中出现伪影如下图中所示的细小棋盘格形状这会破坏输出的质量。然而在许多性能优异的 GAN 中仍然使用转置卷积。 这两种方法UpSampling2D Conv2D 和 Conv2DTranspose都可以用于将随即向量转换回原始图像域在实践中我们可以尝试不同方法以获得最佳生成效果。 3.3 DCGAN 模型训练 DCGAN 中生成器和判别器的架构非常简单与 VAE 模型并没有太大的区别。理解 GAN 的关键在于了解生成器和判别器的训练过程。 为了训练判别器我们可以创建一个训练集其中一些图像是来自训练集的真实观测样本还有一些图像是生成器的输出结果真实图像对应的标签为 1生成图像对应点标签为 0。如果将其视为一个监督学习问题那么就可以训练判别器如何区分原始图像和生成图像之间的差异输出结果表示输入图像为真实图像的概率使用二元交叉熵作为损失函数。 在训练生成器时我们需要找到一种评价每个生成的图像的方法以便它可以优化图像。判别器正是这种评价方法生成器可以生成一批图像并将其通过判别器以获取每个图像的真实性概率得分。为了让生成的图像欺骗判别器即我们希望判别器对生成器生成的图片输出结果接近于 1因此生成器的损失函数就是判别器的输出概率与一个全为1的向量之间的二元交叉熵。 因此为了训练生成器我们必须将生成器连接到判别器体具体而言我们将生成器的输出图像输入到判别器后这个组合模型就可以根据判别器输出生成图像为真的概率 为了训练这个组合模型我们必须交替训练这两个网络并确保一次只更新一个网络的权重。例如在生成器训练过程中我们必须冻结判别器的权重只更新生成器的权重。如果我们也允许判别器的权重发生变化那么判别器只会调整自己以便更有可能将生成的图像预测为真实图像而这不是我们期望的结果。我们希望生成的图像被预测接近 1 (真实)是由于生成器性能强而不是因为判别器性能弱。下图展示了判别器和生成器的训练过程。 在 Keras 中可以通过自定义 train_step 函数实现以上训练过程 class DCGAN(models.Model):def __init__(self, discriminator, generator, latent_dim):super(DCGAN, self).__init__()self.discriminator discriminatorself.generator generatorself.latent_dim latent_dimdef compile(self, d_optimizer, g_optimizer):super(DCGAN, self).compile()# 生成器和判别器的损失函数均为 BinaryCrossentropyself.loss_fn losses.BinaryCrossentropy()self.d_optimizer d_optimizerself.g_optimizer g_optimizerself.d_loss_metric metrics.Mean(named_loss)self.d_real_acc_metric metrics.BinaryAccuracy(named_real_acc)self.d_fake_acc_metric metrics.BinaryAccuracy(named_fake_acc)self.d_acc_metric metrics.BinaryAccuracy(named_acc)self.g_loss_metric metrics.Mean(nameg_loss)self.g_acc_metric metrics.BinaryAccuracy(nameg_acc)propertydef metrics(self):return [self.d_loss_metric,self.d_real_acc_metric,self.d_fake_acc_metric,self.d_acc_metric,self.g_loss_metric,self.g_acc_metric,]def train_step(self, real_images):# Sample random points in the latent spacebatch_size tf.shape(real_images)[0]# 从多元标准正态分布中随机采样一批向量random_latent_vectors tf.random.normal(shape(batch_size, self.latent_dim))# Train the discriminator on fake imageswith tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:# 将这些向量通过生成器生成一批图像generated_images self.generator(random_latent_vectors, trainingTrue)# 使用判别器预测真实图像与生成图像的真实性概率real_predictions self.discriminator(real_images, trainingTrue)fake_predictions self.discriminator(generated_images, trainingTrue)real_labels tf.ones_like(real_predictions)real_noisy_labels real_labels NOISE_PARAM * tf.random.uniform(tf.shape(real_predictions))fake_labels tf.zeros_like(fake_predictions)fake_noisy_labels fake_labels - NOISE_PARAM * tf.random.uniform(tf.shape(fake_predictions))# 判别器损失是真实图像(标签为 1 )和生成图像(标签为 0 )的二元交叉熵的平均值d_real_loss self.loss_fn(real_noisy_labels, real_predictions)d_fake_loss self.loss_fn(fake_noisy_labels, fake_predictions)d_loss (d_real_loss d_fake_loss) / 2.0# 生成器损失是判别器对生成图像的预测与标签 1 之间的二元交叉熵g_loss self.loss_fn(real_labels, fake_predictions)gradients_of_discriminator disc_tape.gradient(d_loss, self.discriminator.trainable_variables)gradients_of_generator gen_tape.gradient(g_loss, self.generator.trainable_variables)# 分别更新判别器和生成器的权重self.d_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))self.g_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))# Update metricsself.d_loss_metric.update_state(d_loss)self.d_real_acc_metric.update_state(real_labels, real_predictions)self.d_fake_acc_metric.update_state(fake_labels, fake_predictions)self.d_acc_metric.update_state([real_labels, fake_labels], [real_predictions, fake_predictions])self.g_loss_metric.update_state(g_loss)self.g_acc_metric.update_state(real_labels, fake_predictions)return {m.name: m.result() for m in self.metrics}# Create a DCGAN dcgan DCGAN(discriminatordiscriminator, generatorgenerator, latent_dimZ_DIM )dcgan.compile(d_optimizeroptimizers.Adam(learning_rateLEARNING_RATE, beta_1ADAM_BETA_1, beta_2ADAM_BETA_2),g_optimizeroptimizers.Adam(learning_rateLEARNING_RATE, beta_1ADAM_BETA_1, beta_2ADAM_BETA_2), )dcgan.fit(train, epochsEPOCHS)在生成器训练期间由于判别器被冻结它的权重不会被更新而生成器的权重将朝着能够更好地生成图像(更有可能骗过判别器的图像)的方向移动(也就是让判别器的预测值接近 1)。 判别器和生成器不断博弈可能导致 DCGAN 的训练过程不稳定。理想情况下训练过程能够找到一个平衡点使得生成器能够从判别器中学习到有意义的信息并且图像的质量开始提高。经过足够多的 epochs 后判别器往往会占优势但生成器在此时可能已经学会生成足够高质量的图像了。 为标签添加一些微小的随机噪音是训练 GAN 时的一个有用技巧。这有助于提高训练过程的稳定性并增强生成的图像。这种标签平滑能够使判别器处理更具挑战性的任务而不至于令生成器无法训练。 通过观察训练过程中生成器的生成图像可以明显看出生成器生成的图像越来越接近从训练集中采样的图像。 可以看到神经网络有能力将随机噪音转化为有意义的内容同时除了原始图像外我们没有为模型提供任何额外的特征因此它必须独自学习高级特征例如绘制阴影、立方体和圆圈。 成功的生成模型还需要满足一个要求即它不能仅仅是复制训练集中已有的图像。为了测试这一点我们可以从训练数据集中找到与生成图像最接近的图像可以使用 L1 距离度量图像间的距离 def compare_images(img1, img2):return np.mean(np.abs(img1 - img2))下图展示了一些生成图像在训练集中与之最接近的观测样本。可以看出虽然生成的图像和训练集之间存在一定程度的相似性但它们并非完全相同。这表明生成器已经学习到训练数据集中的高级特征并能够生成与训练数据集中图像不同的样本。 4. GAN 训练技巧 虽然 GAN 是生成模型领域的重大突破但也存在训练难度较大的问题。在本节中我们将探讨训练 GAN 时遇到的一些最常见的问题以及相应的解决方案。 4.1 判别器强于生成器 如果判别器变得过强损失函数的信号就会变得过弱无法推动生成器产生有意义的改进。在最糟糕的情况下判别器完全学会了区分真实图像和虚假图像导致梯度完全消失从而无法进行任何训练。 如果判别器的损失函数失控就需要弱判别器 增加判别器中 Dropout 层的丢弃率减少信息通过网络的量降低判别器的学习率减少判别器中的卷积滤波器数量在训练判别器时为标签添加噪声在训练判别器时随机将一些图像的标签反转(从 0 变为 1或从 1 变为 0) 4.2 生成器强于判别器 如果判别器不够强大生成器会找到轻松欺骗判别器的方法并只生成一小部分几乎相同的图像样本这称为模式坍塌 (Mode Collapse)。 假设我们在不更新判别器的情况下对生成器进行了多次训练。生成器倾向于找到一个总是能够欺骗判别器的单个观测样本(也称为模式)并开始将潜在输入空间中的每个点映射到这个观测样本图像。此外损失函数的梯度会趋近于零因此无法从此状态恢复。 即使我们随后尝试重新训练判别器以阻止其被这一个模式欺骗生成器仍会找到另一个模式判别器的模式因为它已经没有多样化输出的动力。 如果生成器出现模式崩溃的问题可以尝试使用与上一小节相反的方法来加强判别器。此外也可以尝试减小两个网络的学习率并增加批大小。 4.3 信息量不足 由于深度学习模型被编译为最小化损失函数因此可能自然地认为生成器的损失函数越小生成的图像质量就越好。然而由于生成器只针对当前的判别器进行评估而判别器在不断改进我们无法比较在训练过程中不同时间点评估的损失函数。实际上在训练过程中尽管图像质量明显提高生成器的损失也可能会随着时间的推移而增加。由于生成器损失与图像质量之间缺乏相关性有时使得 GAN 的训练难以监控。 4.4 超参数 在 GAN 训练过程中我们可以看到即使是简单的 GAN 也有大量需要调整的超参数 (Hyperparameter)。除了判别器和生成器的整体架构外还有一些参数控制着批归一化、Dropout、学习率、激活层、卷积核大小、步长、批大小和潜空间大小等。GAN 对这些参数的微小变化非常敏感因此找到一组有效的参数通常需要反复实验而没有一套既定的准则。 因此了解 GAN 的内部工作原理并知道如何解读损失函数至关重要只有这样才能合理的进行超参数调整以提高模型的稳定性。 小结 在本节中我们首先介绍了生成对抗网络 (Generative Adversarial Network, GAN) 的基本原理并学习了如何训练 DCGAN 生成玩具积木图像GAN 能够学会以图像的形式真实地表示 3D 对象包括阴影、形状和纹理还探讨了 GAN 训练过程中可能会遇到的问题及相应的解决方法和训练技巧。 系列链接 AIGC实战——生成模型简介 AIGC实战——深度学习 (Deep Learning, DL) AIGC实战——卷积神经网络(Convolutional Neural Network, CNN) AIGC实战——自编码器(Autoencoder) AIGC实战——变分自编码器(Variational Autoencoder, VAE) AIGC实战——使用变分自编码器生成面部图像
http://www.zqtcl.cn/news/427824/

相关文章:

  • 苍南网站建设深圳百度关键字优化
  • 网站建设流程及规范是做网站设计好还是杂志美编好
  • 网站模板 登陆南昌做网站开发的公司有哪些
  • 移动网站建设是什么商丘哪里教做网站的
  • 网站建设排名的公司江东seo做关键词优化
  • 学习网站开发培训网站内链是什么
  • 中文 域名的网站用wordpress做的网站有哪些
  • 网站建设中需要注意的问题唐山自助建站模板
  • 网站建设捌金手指下拉一重庆 网站定制
  • 网站建设需求调研方法自己做网站要多少钱
  • 北流网站建设公众号开发 表格
  • 做教育类网站一般流程苏宁易购网站风格
  • 兼职网站推广如何做如何用ps做网站
  • 济南外贸网站建设软件公司网站
  • 衡阳做网站注册网站流程
  • 关于网站建设的申请报告wordpress花园网站
  • jsp网站 iis免费企业信息查询
  • 泊头市网站建设公司只有企业自己建立网站平台进行
  • 有阿里云服务器 怎么做网站找广告设计
  • 网站建设 ui设计公司素材网站源码
  • 网站响应式布局wordpress代码混乱
  • 免费建设个人网站四川建设人员信息查询
  • 做国际网站有哪些专门做拼花网站
  • eclipse sdk做网站小程序开发报价明细
  • 网站开发源码售卖合同百度广告投诉电话
  • wordpress读法鄂州seo
  • 网站建设方案的写作方法媒体发稿推广
  • 免费的网站空间注册空壳公司判几年
  • 网站怎么运营推广达美网站建设
  • 江苏建设人才网网站中国最新时事新闻