如何从头开始使用 Keras 开发辅助分类器 GAN (AC-GAN)

生成对抗网络(GAN)是一种用于训练生成模型(例如用于生成图像的深度卷积神经网络)的架构。

条件生成对抗网络,简称 cGAN,是一种 GAN,它涉及生成器模型对图像进行条件生成。图像生成可以以类别标签为条件(如果可用),从而能够有针对性地生成给定类型的图像。

辅助分类器 GAN,简称 AC-GAN,是条件 GAN 的一个扩展,它改变了判别器,使其能够预测给定图像的类别标签,而不是将类别标签作为输入。它能够稳定训练过程,并生成大型高质量图像,同时学习到与类别标签无关的潜在空间表示。

在本教程中,您将了解如何开发一个用于生成服装照片的辅助分类器生成对抗网络。

完成本教程后,您将了解:

  • 辅助分类器 GAN 是一种条件 GAN,它要求判别器预测给定图像的类别标签。
  • 如何为 AC-GAN 开发生成器、判别器和组合模型。
  • 如何训练、评估并使用 AC-GAN 从 Fashion-MNIST 数据集生成服装照片。

用我的新书《Python 生成对抗网络》开启您的项目,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

  • 2021 年 1 月更新:已更新,以便层冻结与批处理归一化一起使用。
How to Develop an Auxiliary Classifier GAN (AC-GAN) From Scratch with Keras

如何从头开始使用 Keras 开发辅助分类器 GAN (AC-GAN)
照片作者:ebbe ostebo,保留部分权利。

教程概述

本教程分为五个部分;它们是:

  1. 辅助分类器生成对抗网络
  2. Fashion-MNIST 服装照片数据集
  3. 如何定义 AC-GAN 模型
  4. 如何为 Fashion-MNIST 开发 AC-GAN
  5. 如何使用 AC-GAN 生成服装

辅助分类器生成对抗网络

生成对抗网络是一种用于训练生成模型(通常是用于生成图像的深度卷积神经网络)的架构。

该架构由一个生成器模型(以潜在空间中的随机点作为输入并生成图像)和一个判别器(用于将图像分类为真实(来自数据集)或伪造(生成))组成。然后,这两个模型在一个零和博弈中同时进行训练。

条件 GAN,简称 cGAN 或 CGAN,是 GAN 架构的扩展,它为潜在空间增加了结构。GAN 模型的训练方式改为:生成器同时接收潜在空间中的一个点和一个类别标签作为输入,并尝试为该类别生成图像。判别器同时接收图像和类别标签,并必须像以前一样对图像是真实还是伪造进行分类。

添加类别作为输入使得图像生成过程和图像分类过程都以类别标签为条件,因此得名。其效果是训练过程更稳定,并且生成的生成器模型可用于生成特定类型的图像,例如针对某个类别标签。

辅助分类器 GAN,简称 AC-GAN,是基于 CGAN 扩展的 GAN 架构的进一步扩展。它由 Google Brain 的 Augustus Odena 等人在 2016 年的论文“Conditional Image Synthesis with Auxiliary Classifier GANs”中提出。

与条件 GAN 一样,AC-GAN 中的生成器模型同时接收潜在空间中的一个点和类别标签作为输入,例如,图像生成过程是有条件的。

主要区别在于判别器模型,它仅以图像作为输入,而条件 GAN 则以图像和类别标签作为输入。然后,判别器模型必须像以前一样预测给定图像是真实还是伪造,并且还必须预测图像的类别标签。

… 该模型[…]是类别条件的,但带有一个辅助解码器,该解码器负责重建类别标签。

Conditional Image Synthesis With Auxiliary Classifier GANs,2016。

该架构的描述方式是,判别器和辅助分类器可以被视为共享模型权重的独立模型。实际上,判别器和辅助分类器可以实现为具有两个输出的单个神经网络模型。

第一个输出是通过 sigmoid 激活函数计算出的一个概率,指示输入图像的“真实性”,并使用二元交叉熵进行优化,就像普通的 GAN 判别器模型一样。

第二个输出是通过 softmax 激活函数计算出的图像属于每个类别的概率,就像任何给定的多类分类神经网络模型一样,并使用分类交叉熵进行优化。

总结一下

生成器模型

  • 输入:来自潜在空间的随机点和类别标签。
  • 输出:生成的图像。

判别器模型

  • 输入:图像。
  • 输出:提供的图像为真实的概率,图像属于每个已知类别的概率。

下图总结了包括 AC-GAN 在内的一系列条件 GAN 的输入和输出,为理解它们之间的差异提供了一些背景。

Summary of the Differences Between the Conditional GAN, Semi-Supervised GAN, InfoGAN and AC-GAN

条件 GAN、半监督 GAN、InfoGAN 和 AC-GAN 之间差异的总结。
来源:Conditional Image Synthesis With Auxiliary Classifier GANs 的版本。

判别器旨在最大化正确分类真实和伪造图像(LS)以及正确预测真实或伪造图像的类别标签(LC)的概率(例如,LS + LC)。生成器旨在最小化判别器区分真实和伪造图像的能力,同时最大化判别器预测真实和伪造图像类别标签的能力(例如,LC – LS)。

目标函数有两个部分:正确来源的对数似然 LS,以及正确类别的对数似然 LC。 […] D 被训练来最大化 LS + LC,而 G 被训练来最大化 LC − LS。

Conditional Image Synthesis With Auxiliary Classifier GANs,2016。

生成的生成器学习的潜在空间表示与类别标签无关,这与条件 GAN 不同。

AC-GAN 学习的 z 表示与类别标签无关。

Conditional Image Synthesis With Auxiliary Classifier GANs,2016。

以这种方式改变条件 GAN 的效果是:训练过程更稳定,并且模型能够生成比以前更高质量、更大尺寸的图像,例如 128×128 像素。

… 我们证明,在 GAN 潜在空间中添加更多结构以及专门的成本函数可以产生更高质量的样本。 […] 重要的是,我们定量地证明了我们的高分辨率样本不仅仅是低分辨率样本的简单缩放。

Conditional Image Synthesis With Auxiliary Classifier GANs,2016。

想从零开始开发GAN吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

Fashion-MNIST 服装照片数据集

提出了 Fashion-MNIST 数据集,作为 MNIST 手写数字数据集一个更具挑战性的替代数据集。

它是一个包含 60,000 张 28x28 像素的小型方形灰度图像的数据集,图像内容是 10 种类型的服装物品,例如鞋子、T 恤、连衣裙等。

Keras 通过 fashion_mnist.load_dataset() 函数提供了对 Fashion-MNIST 数据集的访问。它返回两个元组,一个包含标准训练数据集的输入和输出元素,另一个包含标准测试数据集的输入和输出元素。

下面的示例加载数据集并总结了加载数据集的形状。

注意:第一次加载数据集时,Keras 会自动下载该图像的压缩版本,并将其保存在您的主目录下的 ~/.keras/datasets/ 中。下载速度很快,因为数据集压缩后仅约 25MB。

运行示例会加载数据集并打印图像训练和测试分割的输入和输出组件的形状。

我们可以看到训练集中有 6 万个样本,测试集中有 1 万个样本,并且每个图像都是 28 x 28 像素的正方形。

这些图像是灰度的,背景为黑色(像素值为 0),服装为白色(像素值接近 255)。这意味着如果绘制这些图像,它们将主要是黑色的,中间有一个白色的服装。

我们可以使用 matplotlib 库和 imshow() 函数绘制训练数据集中的一些图像,并通过“cmap”参数指定颜色映射为“gray”,以正确显示像素值。

或者,当我们反转颜色并将背景显示为白色,服装显示为黑色时,图像更容易查看。

现在图像大部分是白色,感兴趣区域是黑色,因此它们更容易查看。这可以通过使用反向灰度颜色映射来实现,如下所示:

下面的示例以 10x10 的方形绘制了训练数据集的前 100 张图像。

运行该示例将创建一个包含 MNIST 训练数据集的前 100 张图像的图,这些图像排列成一个 10x10 的正方形。

Plot of the First 100 Items of Clothing From the Fashion MNIST Dataset.

Fashion MNIST 数据集的前 100 件服装图。

我们将使用训练数据集中的图像作为训练生成对抗网络的基础。

具体来说,生成器模型将学会如何生成新的逼真服装,使用判别器来尝试区分来自 Fashion MNIST 训练数据集的真实图像和生成器模型输出的新图像,并为每个图像预测类别标签。

这是一个相对简单的问题,不需要复杂的生成器或判别器模型,尽管它确实需要生成灰度输出图像。

如何定义 AC-GAN 模型

在本节中,我们将为 AC-GAN 开发生成器、判别器和组合模型。

AC-GAN 论文的附录提供了一些生成器和判别器配置的建议,我们将以此为灵感。下表总结了论文中针对 CIFAR-10 数据集的这些建议。

AC-GAN Generator and Discriminator Model Configuration Suggestions

AC-GAN 生成器和判别器模型配置建议。
来源:Conditional Image Synthesis With Auxiliary Classifier GANs。

AC-GAN 判别器模型

让我们从判别器模型开始。

判别器模型必须以图像作为输入,并预测图像的“真实性”概率以及图像属于每个给定类别的概率。

输入图像的形状为 28x28x1,Fashion MNIST 数据集中的服装类别有 10 个。

该模型可以按照 DCGAN 架构进行定义。也就是说,使用高斯权重初始化、批量归一化、LeakyReLU、Dropout,并使用 2x2 步幅进行下采样,而不是使用池化层。

例如,下面是使用 Keras 函数式 API 定义的判别器模型主体。

主要区别在于模型有两个输出层。

第一个是具有 sigmoid 激活函数的单个节点,用于预测图像的真实性。

第二个是多个节点,每个类别一个,使用 softmax 激活函数来预测给定图像的类别标签。

然后,我们可以使用单个输入和两个输出来构建模型。

该模型必须使用两个损失函数进行训练:第一个输出层的二元交叉熵,第二个输出层的分类交叉熵损失。

与通常的做法是将独热编码的类别标签与第二个输出层进行比较不同,我们可以直接比较整数类别标签。我们可以使用稀疏分类交叉熵损失函数来实现这一点。这与分类交叉熵的效果相同,但避免了手动对目标标签进行独热编码的步骤。

在编译模型时,我们可以通过指定一个字符串函数名称列表来告知 Keras 将两个不同的损失函数用于两个输出层;例如:

模型使用随机梯度下降的 Adam 版本进行拟合,具有较小的学习率和适中的动量,这正是 DCGAN 所推荐的。

将这些内容整合起来,define_discriminator() 函数将为 AC-GAN 定义并编译判别器模型。

输入图像的形状和类别数量被参数化并设置了默认值,以便将来可以轻松地为您的项目进行更改。

我们可以定义并总结这个模型。

完整的示例如下所示。

运行示例首先会打印模型的摘要。

这证实了输入图像的预期形状以及两个输出层,尽管线性组织使得两个独立的输出层很清晰。

同时,我们创建了模型的图,显示了输入图像的线性处理以及两个清晰的输出层。

Plot of the Discriminator Model for the Auxiliary Classifier GAN

辅助分类GAN的判别器模型图

现在我们已经定义了AC-GAN的判别器模型,我们可以开发生成器模型了。

AC-GAN生成器模型

生成器模型必须接收来自潜在空间的随机点和类别标签作为输入,然后输出一个形状为28x28x1的生成灰度图像。

AC-GAN论文描述的AC-GAN生成器模型接收一个向量输入,该向量是潜在空间点(100维)和独热编码的类别标签(10维)的串联,总共110维。

一种已被证明有效且现在普遍推荐的替代方法是,将类别标签解释为生成器模型早期的一个附加通道或特征图。

这可以通过使用任意维数(例如50维)的可学习嵌入来实现,其输出可以由具有线性激活的全连接层解释,从而产生一个额外的7x7特征图。

潜在空间的点可以通过具有足够激活的全连接层来解释,以创建多个7x7特征图,在这种情况下是384个,并为我们输出图像的低分辨率版本提供基础。

类别标签的7x7单个特征图解释可以然后逐通道连接,resulting in 385 feature maps。

然后,这些特征图可以经过两个转置卷积层进行处理,将7x7的特征图首先上采样到14x14像素,然后最终上采样到28x28特征,每次上采样步骤将特征图的面积扩大四倍。

生成器的输出是单个特征图或灰度图像,形状为28x28,像素值范围为[-1, 1],因为选择了tanh激活函数。我们使用ReLU激活来处理上采样层,而不是LeakyReLU,因为AC-GAN论文有此建议。

我们可以将所有这些内容整合到下面定义的`define_generator()`函数中,该函数将创建并返回AC-GAN的生成器模型。

该模型故意不进行编译,因为它不直接训练;相反,它通过判别器模型进行训练。

我们可以创建此模型,并对其结构进行总结和绘图。

完整的示例如下所示。

运行示例首先会打印模型中各层及其输出形状的摘要。

我们可以确认潜在维度输入是100维,类别标签输入是单个整数。我们还可以确认嵌入类别标签的输出已正确地串联为附加通道,在转置卷积层之前产生385个7x7的特征图。

摘要还证实了单个28x28灰度图像的预期输出形状。

同时,我们还创建了网络的图,总结了每一层的输入和输出形状。

该图证实了网络的两个输入以及输入的正确串联。

Plot of the Generator Model for the Auxiliary Classifier GAN

辅助分类GAN的生成器模型图

现在我们已经定义了生成器模型,我们可以展示如何对其进行拟合。

AC-GAN复合模型

生成器模型不直接更新;相反,它通过判别器模型进行更新。

这可以通过创建一个复合模型来实现,该模型将生成器模型堆叠在判别器模型之上。

这个复合模型的输入是生成器模型的输入,即来自潜在空间的随机点和类别标签。生成器模型直接连接到判别器模型,后者直接接收生成的图像作为输入。最后,判别器模型同时预测生成图像的真实性和类别标签。因此,复合模型使用两个损失函数进行优化,一个用于判别器的每个输出。

判别器模型使用真实和虚假样本以独立的方式进行更新,我们将在下一节回顾如何操作。因此,我们不希望在更新(训练)复合模型时更新判别器模型;我们只希望使用这个复合模型来更新生成器模型的权重。

这可以通过在编译复合模型之前将判别器的层设置为不可训练来实现。当被复合模型查看或使用时,这仅对层权重有影响,并防止它们在复合模型更新时被更新。

下面定义的`define_gan()`函数实现了这一点,它以已经定义的生成器和判别器模型作为输入,并定义了一个新的复合模型,该模型可用于仅更新生成器模型。

现在我们已经定义了AC-GAN中使用的模型,我们可以将它们拟合到Fashion-MNIST数据集上。

如何为 Fashion-MNIST 开发 AC-GAN

第一步是加载和准备Fashion MNIST数据集。

我们只需要训练数据集中的图像。这些图像是黑白的,因此我们必须添加一个额外的通道维度来将它们转换为三维,这是我们的模型卷积层所期望的。最后,像素值必须缩放到[-1,1]的范围以匹配生成器模型的输出。

下面定义的`load_real_samples()`函数实现了这一点,它返回加载和缩放后的Fashion MNIST训练数据集,准备好进行建模。

每次更新GAN模型时,我们都需要一个批次(或半个批次)的真实图像。一个简单的方法是每次从数据集中选择一个随机样本。

下面定义的`generate_real_samples()`函数实现了这一点,它以准备好的数据集作为参数,选择并返回一个随机样本的Fashion MNIST图像和服装类别标签。

提供给函数的“dataset”参数是一个列表,包含从`load_real_samples()`函数返回的图像和类别标签。该函数还返回它们对应的类别标签给判别器,特别是类别=1表示它们是真实图像。

接下来,我们需要为生成器模型准备输入。

这些是潜在空间中的随机点,具体来说是高斯分布的随机变量

generate_latent_points() 函数实现了这一点,它接受潜在空间的大小作为参数,以及所需的点数,并将它们作为生成器模型的输入样本批次返回。该函数还返回 Fashion-MNIST 数据集中 10 个类别标签中 [0,9] 范围内(包含两端)的随机选择的整数。

接下来,我们需要使用潜在空间中的点和服装类别标签作为生成器的输入,以生成新图像。

下面的 generate_fake_samples() 函数实现了这一点,它接受生成器模型和潜在空间的大小作为参数,然后生成潜在空间中的点并使用它们作为生成器模型的输入。

该函数返回生成的图像、它们对应的服装类别标签以及它们的判别器类别标签,具体来说是类别=0,表示它们是假的或生成的。

没有可靠的方法可以确定何时停止训练 GAN;相反,可以主观地检查图像以选择最终的模型。

因此,我们可以定期使用生成器模型生成图像样本,并将生成器模型保存到文件中以供将来使用。下面的 summarize_performance() 函数实现了这一点,它生成 100 张图像,绘制它们,并将绘图和生成器保存到文件中,文件名中包含训练“step”编号。

我们现在准备好拟合GAN模型了。

模型训练 100 个训练周期,这只是一个任意值,因为模型在大约 20 个周期后就开始生成合理的衣物图像了。批量大小为 64 个样本,每个训练周期涉及 60,000/64,即约 937 个真实和虚假样本批次以及模型更新。summarize_performance() 函数每 10 个周期调用一次,即每 (937 * 10) 9,370 个训练步骤调用一次。

对于给定的训练步骤,首先,判别器模型会为一半的真实样本批次更新,然后为一半的虚假样本批次更新,两者共同构成一个权重更新批次。然后,生成器通过组合的 GAN 模型进行更新。重要的是,虚假样本的类别标签设置为 1,即真实。这会在下一个批次中将生成器更新为更好地生成真实样本。

注意,判别器和复合模型从调用 train_on_batch() 函数中返回三个损失值。第一个值是损失值的总和,可以忽略,而第二个值是真实/虚假输出层的损失,第三个值是衣物类别分类的损失。

下面的 train() 函数实现了这一点,它接受定义的模型、数据集和潜在维度的大小作为参数,并使用默认参数为训练周期数和批量大小进行参数化。生成器模型在训练结束时保存。

我们可以定义潜在空间的大小,定义所有三个模型,并在加载的 fashion MNIST 数据集上训练它们。

将所有这些联系在一起,完整的示例如下。

运行示例可能需要一些时间,建议使用GPU硬件,但并非必需。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能有所不同。请考虑运行该示例几次并比较平均结果。

每次训练迭代都会报告损失,包括判别器在真实样本上的真实/虚假类别损失 (dr),判别器在虚假样本上的损失 (df),以及生成器通过复合模型在生成图像时进行的更新 (g)。

在运行过程中,总共生成了 10 张样本图像,并保存了 10 个模型。

10 个迭代后生成的服装图已经看起来很合理了。

Example of AC-GAN Generated Items of Clothing after 10 Epochs

10 个周期后 AC-GAN 生成的服装示例

图像在整个训练过程中保持可靠。

Example of AC-GAN Generated Items of Clothing After 100 Epochs

100 个周期后 AC-GAN 生成的服装示例

如何使用 AC-GAN 生成服装

在本节中,我们可以加载一个已保存的模型,并使用它来生成新的服装,这些服装看起来像是来自 Fashion-MNIST 数据集。

AC-GAN 在技术上并不根据类别标签条件生成图像,至少不像条件 GAN 那样。

AC-GAN 学习的 z 表示与类别标签无关。

Conditional Image Synthesis With Auxiliary Classifier GANs,2016。

尽管如此,如果以此方式使用,生成的图像大多与类别标签匹配。

下面的示例加载了运行结束时的模型(任何已保存的模型都可以),并生成了 100 个类别为 7(运动鞋)的示例。

运行该示例,在这种情况下,会生成 100 张非常逼真的运动鞋照片。

Example of 100 Photos of Sneakers Generated by an AC-GAN

AC-GAN 生成的 100 张运动鞋照片示例

可以尝试其他类别的数值。

例如,下面是 100 件生成的上衣(n_class = 4)。大多数图像是上衣,但也有几条裤子,这表明潜在空间在一定程度上是类条件性的,但不是完全类条件性的。

Example of 100 Photos of Coats Generated by an AC-GAN

AC-GAN 生成的 100 件外套照片示例

扩展

本节列出了一些您可能希望探索的扩展本教程的想法。

  • 生成图像。为每个服装类别生成图像,并比较不同保存模型(例如,第 10、20 个周期等)的结果。
  • 备选配置。更新生成器、判别器或两个模型的配置,以获得更多或更少的容量,并比较结果。
  • CIFAR-10 数据集。将示例更新为在 CIFAR-10 数据集上训练,并使用论文附录中描述的模型配置。

如果您探索了这些扩展中的任何一个,我很想知道。
请在下面的评论中发布您的发现。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

论文

API

文章

总结

在本教程中,您学习了如何开发一个辅助分类器生成对抗网络,用于生成服装照片。

具体来说,你学到了:

  • 辅助分类器 GAN 是一种条件 GAN,它要求判别器预测给定图像的类别标签。
  • 如何为 AC-GAN 开发生成器、判别器和组合模型。
  • 如何训练、评估并使用 AC-GAN 从 Fashion-MNIST 数据集生成服装照片。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发生成对抗网络!

Generative Adversarial Networks with Python

在几分钟内开发您的GAN模型

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 构建生成对抗网络

它提供了关于以下内容的自学教程端到端项目
DCGAN条件GAN图像翻译Pix2PixCycleGAN
以及更多...

最终将GAN模型引入您的视觉项目

跳过学术理论。只看结果。

查看内容

120 条回复如何从头开始开发辅助分类器 GAN (AC-GAN) 和 Keras

  1. joyce 2019 年 7 月 19 日下午 1:47 #

    感谢您出色的博客。
    我想问一个问题,Tensorflow 还是 Keras,您推荐哪一个来实现 rnn/deep-lstm/encoder-decoder/...?
    我觉得两者都很好,但我不知道如何选择。

    再次感谢

    • Jason Brownlee 2019 年 7 月 19 日下午 2:25 #

      Keras。

      • WP 2019 年 7 月 23 日下午 8:33 #

        感谢您的精彩文章!🙂

        我试图更好地理解潜在空间,当“AC-GANs 学习 z 的表示独立于类别标签”时。这意味着,如果我有一个 2D 的潜在空间,为了简单起见,潜在空间不像变分自编码器那样有特定类别的区域吗?

        • Jason Brownlee 2019 年 7 月 24 日上午 7:53 #

          它不强制或保证映射或关联,但它会捕捉到对模型进行图像合成有意义的东西。

          要实现真正的控制,请使用条件 GAN 或 InfoGAN。

  2. Aleem 2019 年 7 月 19 日晚上 9:12 #

    感谢您的博客 Jason,您非常清晰地阐述了这些概念,您的帖子帮助我理解了机器学习中的各种主题。

    供您参考,tensorflow 2.0 包含 keras,所以我会在 tf2 中使用 keras

    • Jason Brownlee 2019 年 7 月 20 日上午 10:52 #

      谢谢你的支持。

      TF2 尚未发布,它仍处于测试阶段。在此阶段,我推荐独立的 Keras。

  3. tvtaerum 2019 年 8 月 8 日下午 2:21 #

    一如既往,我对您的工作印象深刻。我尝试了您为 2D 图形、LS-GAN/CGANS 的类似工作以及最终的 AC-GAN 编写的程序。我必须承认,我不得不安使用 Keras 的 TensorFlow 版本(Keras 本身由于某种原因对我不起作用)。我在 define_gan 例程中尝试了以下语句,并在最后测试时发现它在生成正确的服装图标方面做得更好

    model.compile(loss=[‘mse’, ‘sparse_categorical_crossentropy’], optimizer=opt)

    我喜欢 mse 的原因与 LS-GAN 提供的理由完全相同……在我看来,mse 提供了与“正确”生成的距离度量,而不仅仅是“正确性”的度量。

    但是,我不确定为什么它会在此问题中起作用,因为还使用了标签。MSE 是否仅适用于图标,而不适用于标签(0 到 9)?希望我说的有道理。

    我相信您在某个地方解释过,但它对我来说太难了。

    感谢您的出色工作。

    • Jason Brownlee 2019 年 8 月 8 日下午 2:24 #

      谢谢。

      干得好!是的,我是 MSE 损失的忠实粉丝,它也广泛用于 pix2pix 和 cyclegan 等高级 GAN。

  4. Fatimah 2019 年 10 月 29 日凌晨 2:31 #

    感谢您出色的博客 Jason,

    深度学习在图像数据方面显示出强大的能力,但它也可以用于时间序列和原始数据,不是吗?

    不幸的是,我找不到足够多的资源和示例来将深度学习应用于非图像数据集。

    我的问题是,
    将非图像数据,原始数据集,例如,应用于此方法是否值得?
    如果值得,您能否指引我找到有用的资源和指导?

    在此先感谢,

  5. Rhizky 2019 年 11 月 28 日凌晨 3:29 #

    感谢 Jason 条理清晰的文章,

    我正在尝试根据研究论文中提供的超参数为 Cifar10 重建它,我看到在几千步之后,判别器对虚假图像的类别损失下降并围绕零波动,而真实/虚假损失保持在 0.7 左右。我不确定这是否意味着生成器正在学习,因为根据我的理解,判别器损失达到零意味着它失败了。此外,生成器损失也在零附近波动。这是否意味着我必须重新开始并更改超参数?

    再次感谢

  6. Raj GP 2019年11月30日下午4:55 #

    如何预测给定图像的类别标签?

    • Jason Brownlee 2019年12月1日上午5:39 #

      GANs不用于图像分类,而是可以使用这里描述的各种模型。
      https://machinelearning.org.cn/start-here/#dlfcv

      • Raj GP 2019年12月1日下午7:38 #

        AC-GAN图中的“C”表示什么?
        鉴别器的输出是什么?它被提及为“提供的图像是真实的概率、图像属于每个已知类的概率”。——这是什么意思?
        我如何检查这一点?

      • Nhung nguyen 2021年3月7日下午4:46 #

        先生,但您说AC gan可以预测给定图像的类别,这是什么意思?

        • Jason Brownlee 2021年3月8日上午4:43 #

          这意味着该模型是在具有图像标签的数据上进行训练的。

  7. sarvani 2020年1月9日下午5:29 #

    感谢您精彩的博客和您的GAN书,Jason。
    请帮助我更好地理解这一点。

    我的疑问是,AC GAN的损失“LC-LS”如何从“define GAN()”函数中的损失函数中解释出来?

    如果以下代码在鉴别器中确定了LC +LS:

    model.compile(loss=[‘binary_crossentropy’, ‘sparse_categorical_crossentropy’], optimizer=opt)
    (真实图像 y=1,伪造图像 y=0)

    以下代码如何在生成器训练中确定LC-LS???

    model.compile(loss=[‘binary_crossentropy’, ‘sparse_categorical_crossentropy’], optimizer=opt)
    (伪造图像 y=1)

    • Jason Brownlee 2020年1月10日上午7:24 #

      回想一下,生成器是通过鉴别器更新的。

      • sarvani 2020年1月11日晚上9:09 #

        我已经清楚地理解了生成器训练部分。
        我的疑问是,无论我们提到什么损失,模型都会尝试最小化两者。
        我们在代码的不同位置(AC-GAN代码中的第60行和第106行)以相似的方式写了两个损失:1.二元交叉熵损失(用于伪造或真实)2.分类交叉熵损失(用于标签)。

        在一个位置(第60行),二元交叉熵损失应该由鉴别器最小化。
        而在另一个位置(第106行),二元交叉熵损失应该由生成器最大化。

        在TensorFlow中,我们直接提及要最小化的损失,以及要通过负数(即(-loss))最大化的损失。

        您能澄清一下这个疑问吗?

  8. SARVANI CH 2020年2月6日晚上11:35 #

    你好 jason,
    如果我为最终的GAN模型打印准确率,model.compile()的输出有五个参数:

    loss1+loss2, loss1, loss2, accuracy1, accuracy2

    您已经解释了仅使用损失编译时的输出:
    loss1 –用于真实/伪造
    loss2– 用于标签

    那么我是否可以推断:
    accuracy– 用于真实/伪造(当然这没有意义)
    accuracy2– 用于标签????????????

    • Jason Brownlee 2020年2月7日上午8:18 #

      分类器的准确率最相关,鉴别器则不太相关。

      • SARVANI CH 2020年2月7日下午3:46 #

        正如您在model.train_on_batch()中提到的损失顺序:

        “注意,鉴别器和复合模型从调用train_on_batch()函数返回三个损失值。第一个值是损失值的总和,可以忽略,而第二个值是真实/伪造输出层的损失,第三个值是服装标签分类的损失。”

        我们是否也可以对准确率指标应用相同的顺序(如果我们将其作为鉴别器的度量)???

        因为我从model.train_on_batch()得到了两个新值,如果我给出额外的度量‘accuracy’。

        非常感谢您的回复,Jason!

  9. Karan 2020年2月18日凌晨12:33 #

    嗨,Jason,

    您是否用Wasserstein度量实现了Keras ACGAN代码?这将非常有帮助。

  10. Shahid Yousafzai 2020年2月18日下午2:34 #

    感谢您所做的所有精彩工作,我刚接触深度学习,所以可能不太懂,但当我运行这段代码时,步数不断增加,没有迹象表明是epoch号。如果这些步是迭代,那么它们应该是您提到的9370,但在我的情况下,它们一直在进行。您能解释一下吗,先生,那就太好了。

    >18290, dr[0.317,0.741], df[0.474,0.061], g[1.949,0.154]
    >18291, dr[0.236,1.152], df[0.341,0.093], g[2.630,0.043]
    >1829, dr[0.477,0.674], df[0.441,0.143], g[2.447,0.097]
    >18293, dr[0.622,0.789], df[0.402,0.134], g[2.926,0.076]

    • Jason Brownlee 2020年2月19日上午7:54 #

      第一个数字将是epoch号。

      • Shahid Yousafzai 2020年2月19日晚上9:12 #

        感谢您的回复,但在我的情况下,第一个数字代表总步数,即93750步……因为您的模型中有100个epoch,60000张图像和64的批次大小,这使得步数为93750步……无论如何,训练后我弄明白了……所以感谢您所做的所有精彩工作,这个网站和您的工作在我深入学习GAN的旅程中提供了巨大的帮助,没有多少资源能同时提供直觉和实现,所以请继续这项工作,您对学生和研究者来说都是一个巨大的帮助。

  11. Shahid Yousafzai 2020年4月6日晚上5:09 #

    您好!感谢这篇精彩的文章,我想将此实现应用于图像数据集,该数据集只有两个类别:男性和女性。我想对生成的图像进行分类,将它们分为男性或女性。我需要对代码进行哪些更改才能实现我的目标?

    诚挚的问候

    • Jason Brownlee 2020年4月7日上午5:39 #

      不用太多。使用您的数据集而不是我的数据集,也许可以稍微调整模型。更改为二元交叉熵——针对您的两个类别。

      • Shahid Yousafzai 2020年4月8日下午5:50 #

        感谢您的回复,您对许多人来说帮助很大,我将尝试对这个模型进行一些更改来解决我的问题,我想我应该购买您的书籍合集。

    • Sukanthen 2020年6月21日凌晨1:23 #

      GANs能预测图像的标签而不是生成图像吗?

      • Jason Brownlee 2020年6月21日上午6:27 #

        有些可以,但它们是为生成图像而设计的。这是它们的目的。

        • Sukanthen SS 2020年6月22日晚上9:30 #

          谢谢Jason。您能否推荐一些可以用于预测分析的GAN?

          • Jason Brownlee 2020年6月23日上午6:19 #

            GAN通常不用于预测,它们是生成模型。

  12. Fatma Mazen 2020年5月11日凌晨4:17 #

    亲爱的 Adrian,
    感谢您与我们分享您的经验。
    您能否告诉我如何使用球面线性插值(slerp)通过AC-GAN生成人脸?
    标签将如何处理?
    提前感谢

    • Jason Brownlee 2020年5月11日上午6:10 #

      Adrian?

      感谢您的建议,也许我以后会涵盖这个话题。

  13. Fatma Mazen 2020年5月14日上午8:56 #

    亲爱的 Jason,
    非常抱歉造成这种冲突。

  14. Umair 2020年6月28日凌晨3:55 #

    当您在define_gan方法中设置d_model.trainable = False时,我没有看到您将其设置回True。然而,当d_model单独训练时,权重似乎被更新,但在训练gan_model时却没有。并且由于Python参数传递是通过引用进行的,我认为d_model.trainable在其他地方也应该是False。我是否遗漏了什么?

  15. Reyhane 2020年8月3日凌晨6:37 #

    作为一名学生,我应该感谢您提供的所有教程,特别是GANs。我有一个问题,我搜索了很多但找不到任何有用的答案……我的问题是,当我使用BatchNormalization层在模型中时,我在训练阶段没有任何改进……在每个epoch,生成器产生的图像都和我第一个epoch的一样!您能帮我找到解决方案吗……

    • Jason Brownlee 2020年8月3日下午1:30 #

      不客气。

      也许您可以尝试一个替代的模型配置或学习配置,并找到最适合您数据集的方法。

  16. Radoslaw 2020年8月29日凌晨5:37 #

    嗨,Jason,

    您的教程非常精彩。感谢它们。但我有一个ACGAN的问题。每次(而且相信我,我尝试了很多次)我运行您的代码时,我都会在约1k次迭代后出现收敛失败。可能的原因是什么,更重要的是,如何解决这个问题?

    提前感谢您的回复。

    • Jason Brownlee 2020年8月29日上午8:04 #

      为什么要训练这么久?

      训练更少的epoch,并关注生成的图像。

      另外,这些技巧可能有助于避免模式失败/收敛。
      https://machinelearning.org.cn/how-to-code-generative-adversarial-network-hacks/

      • Radoslaw 2020年8月29日晚上9:59 #

        抱歉,我没有说清楚。我像您一样运行了这个示例100个epoch,通过迭代我指的是步数(每个epoch有937步,所以收敛失败出现在大约1个epoch后)。我认为这不算太多。

        • Jason Brownlee 2020年8月30日上午6:40 #

          谢谢。

          也许可以确认您的库是最新的?
          也许可以尝试多次运行示例?
          也许可以尝试调整学习超参数,例如学习率?
          也许可以尝试调整模型复杂度,例如增加或减少层数?
          也许可以尝试GAN技巧?

          • Radosław 2020年9月6日凌晨6:11 #

            我不明白为什么,但在多次尝试后,我找到了收敛失败的原因。在删除了所有BatchNormalization层之后,模型似乎工作得很好。感谢您的帮助。祝您一切顺利。

          • Jason Brownlee 2020年9月6日凌晨6:13 #

            做得好,很高兴听到这个消息。

            另外,对于GAN的“为什么”问题,没有人有很好的想法🙂

    • Shane 2020年12月9日凌晨10:12 #

      感谢Radoslaw提出的移除BatchNorm层的修复建议!我遇到了一个问题,即使训练了100个epoch,输出也很差,但您的建议解决了这个问题。

      谢谢!

  17. Klaus 2020年9月10日凌晨3:26 #

    嗨Jason,感谢您的精彩文章。我正在使用一个包含约9000张图像(4个类别,分辨率为256x192)的ACGAN。我已经实现了您在此文章和其他文章“训练稳定生成对抗网络的技巧”中提到的所有技巧。我为我的网络添加了更多的卷积层,因为图像分辨率更高,并且在使用您的确切代码时,损失很快归零。我的问题是,鉴别器对伪造图像的损失(df)经常非常接近0……它不会一直保持在那里,会上下波动很多,但总是回到0.00几左右。我发现为BatchNorm层添加较小的动量数(如0.8)对此有所帮助,但问题仍然存在。以下是一些典型的值:

    >526, dr[0.863,4.146], df[0.016,0.797], g[1.441,1.510]
    >527, dr[0.485,5.122], df[0.001,0.432], g[1.107,1.458]
    >528, dr[0.714,6.939], df[0.000,0.134], g[2.428,2.347]
    >529, dr[1.288,6.916], df[0.440,1.296], g[1.442,1.757]
    >530, dr[1.151,6.066], df[0.568,2.175], g[0.973,1.084]
    >531, dr[0.714,3.896], df[0.001,1.817], g[2.965,0.757]

    您是否知道应该调整哪个参数来使其更稳定?或者训练集是否太小了?

    非常感谢,您的文章非常有帮助!

    • Klaus 2020年9月10日上午5:53 #

      有没有关于生成器和鉴别器网络参数数量与图像大小之间关系的指导?生成器是否应该像您在此示例中那样始终拥有更多的参数?

    • Jason Brownlee 2020年9月10日上午6:35 #

      干得好!

      也许模型稳定性并不重要?(例如,关注生成的图像)
      也许需要一个更大的模型?
      也许需要更小的学习率?

  18. Michael 2020年9月25日凌晨1:31 #

    嗨Jason,在generate_real_samples中,您每次都从数据集中随机抽取图像。所以如果我理解正确的话,这意味着——因为您随机抽取样本——一个epoch中可能不会使用数据集中的所有图像,而有些图像可能会被使用几次?我以为在一个epoch中,训练集中的所有图像都需要恰好使用一次。随机抽取比确保每个epoch恰好使用所有图像更好,还是不重要?

    • Jason Brownlee 2020年9月25日上午6:37 #

      正确。我选择这种方法是为了简单和与我所有其他GAN教程的一致性。

      是的,您可以将其更改为在每个epoch之前对数据集进行洗牌并枚举所有图像。

      我认为这不会有太大影响,但如果您能证明我是错的,我将不胜感激。

  19. Kimo 2020年10月1日凌晨5:22 #

    你好,
    我在同一个(不平衡)数据集上尝试了CGAN和ACGAN,CGAN生成的图像更加逼真和多样化。在ACGAN中,当我用特定类别生成图像时,它给了我很多来自另一个类别的逼真图像。您对这种情况有什么线索,以及如何解决它?

    • Jason Brownlee 2020年10月1日上午6:33 #

      干得好!

      也许您需要为您的数据集调整模型。

  20. Franz 2020年11月24日凌晨12:10 #

    你好,
    感谢您提供有关ACGAN的出色教程。

    我已将ACGAN应用于人体活动数据集(即加速度计),并从中生成了合成数据。但是,经过多次尝试,我的ACGAN仍然“表现不佳”。如果我进一步检查训练过程,鉴别器对伪造数据的类别损失接近于零,而真实/伪造损失则稳定。

    2020-11-23 21:54:07.524759
    ————— AC-GAN训练 —————
    >10, >10, dr[0.684,1.590], df[0.793,1.600], g[0.415,1.576]
    >20, >10, dr[0.633,1.581], df[0.725,1.595], g[0.619,1.630]
    >30, >10, dr[0.701,1.475], df[0.473,0.388], g[0.959,0.417]
    >40, >10, dr[0.725,0.920], df[0.591,0.112], g[0.376,0.111]
    >50, >10, dr[0.686,0.915], df[0.642,0.023], g[0.444,0.050]
    >60, >10, dr[0.846,0.470], df[0.711,0.025], g[0.566,0.085]
    >70, >10, dr[0.805,0.761], df[0.744,0.022], g[0.593,0.031]
    >80, >10, dr[0.670,0.623], df[0.695,0.018], g[0.678,0.021]
    >90, >10, dr[0.683,0.552], df[0.687,0.005], g[0.698,0.005]
    >100, >10, dr[0.646,0.595], df[0.779,0.050], g[0.646,0.018]
    >110, >10, dr[0.648,0.530], df[0.674,0.000], g[0.804,0.002]

    您是否知道是什么原因以及如何解决?
    谢谢。

    • Jason Brownlee 2020年11月24日上午6:19 #

      也许可以尝试更改模型配置,看看它对生成数据质量的影响。

  21. Inan Uygur 2020年12月7日凌晨3:23 #

    嗨Jason,感谢您的ACGAN教程。我的问题/疑问是,我们能否将此网络用于音频生成,特别是语音命令?我尝试使用命令集的梅尔频谱图来做这件事,但没有取得任何可接受的结果。我想知道这种网络是否可能取得任何好的结果,或者这是一个死胡同。
    您对此有什么看法?
    谢谢。

    • Jason Brownlee 2020年12月7日上午6:19 #

      我不认为可以,它设计用于图像数据。

      也许可以查阅文献,了解适用于音频数据的GAN。

  22. Shane 2020年12月9日凌晨8:08 #

    你好 Jason,

    感谢这篇非常有趣的文章。
    我跟着教程跑了代码,尝试在Fashion-MNiST数据集上运行,但我的结果比您生成的结果差很多。

    训练模型100个epoch后生成图像如下——https://ibb.co/Tv90c25

    您能否帮我改进一下,使其能与您的相媲美?任何帮助都将不胜感激。

    谢谢。

    • Jason Brownlee 2020年12月9日上午9:45 #

      您可能需要多次运行示例才能获得好的结果。

      • Shane 2020年12月9日上午10:09 #

        嗨,Jason,

        感谢您的快速回复。我确实运行了几次模型,结果相同。

        但是,我查看了此帖子中的所有评论,看是否有人遇到相同的问题,并尝试了Radoslaw上面提到的修复方法(评论链接在此供将来参考——https://machinelearning.org.cn/how-to-develop-an-auxiliary-classifier-gan-ac-gan-from-scratch-with-keras/#comment-559908)。

        他移除生成器和鉴别器中BatchNormalization层的解决方案奏效了,并解决了问题。现在,我的结果在仅10个epoch后看起来相当不错,正如您所指出的。

        再次感谢,如果您愿意,可以对帖子进行少量编辑或添加免责声明,以移除BatchNorm层。

        有一件事我不确定,那就是为什么移除BatchNorm层能在此案例中帮助并改善输出?您有什么想法或见解吗?

        • Jason Brownlee 2020年12月9日下午1:24 #

          谢谢,我会调查。

          如果结果通过修改架构看起来更好或评估得更好(取决于您的目标),那么修改就是好的。

  23. Raghu 2020年12月29日上午6:21 #

    AC GAN是否也会像GAN一样出现模式崩溃?

    • Jason Brownlee 2020年12月29日上午7:58 #

      它可能发生,但似乎不太常见。额外的模型/预测似乎增加了一些稳定性(或者我的实验存在偏见——这是可能的)。

  24. Raghu 2020年12月31日下午10:37 #

    好的,我绘制了数据点,在15k个epoch后看起来还可以,没有看到模式崩溃。我有一个有趣的结果,整体判别器模型的准确性在下降,这是预期的,但判别器分类器的性能也随着迭代而变差。根据我们的理解,随着我们进步,分类器应该足够好才对,对吗?

    • Jason Brownlee 2021年1月1日上午5:28 #

      如果您的模型性能不佳,也许您的模型需要进一步调整?

  25. Dhimas Arief` 2021年1月18日下午12:56 #

    嗨,Jason,

    一如既往,这是您一个出色的教程。

    现在,我正尝试将您的代码改编用于将RGB图像分类为5类。我将输入形状设置为(224,224,3),因为原始RGB图像的分辨率很高(约4000×2000像素)。这是一个原始RGB图像的例子:https://grand-challenge-public.s3.amazonaws.com/f/challenge/183/f7be082d-501d-4ac2-a072-b8afc82e551a/sample.jpg

    经过100个epoch后,我在训练集(413张图像)上获得了大约80%的分类准确率,但测试准确率非常低。这是生成器模型生成的图像的一个例子:https://ibb.co/FDZ6ZxQ。您能否指导我提高测试准确率?

    • Jason Brownlee 2021年1月18日下午1:49 #

      干得好。

      也许尝试调整模型架构或学习参数以查看是否有区别?
      也许尝试以其他方式准备图像数据,例如标准化与归一化?

      • Dhimas Arief 2021年1月18日下午2:16 #

        感谢您及时回复,Jason。

        目前,我还没有尝试调整参数,仍然使用您的默认学习参数值。我猜您是正确的,我稍后会尝试调整它们。
        但我目前的担忧是:我是否需要改进生成器模型,而不是您的模型,因为我处理的是RGB图像,而且它们的尺寸也比您在本教程中使用的图像大?
        也许我也需要改进判别器的容量?

        提前感谢。

        • Jason Brownlee 2021年1月19日上午6:33 #

          也许吧。我们无法立刻知道。我建议您进行实验并找出答案。

  26. Apollon James 2021年1月25日下午10:05 #

    你好,
    感谢您的帖子,它真的很有帮助!我正在为一个项目创建一个AC-GAN,我想问一下,我将标签和潜在空间连接起来是否适合生成器学习不同的标签,因为目前它为所有标签输出相同的图像?

    input_latent = Input(shape=(z_size,))
    input_label = Input(shape=(1,))
    in_label = Dense(z_size)(input_label)

    merged = Concatenate()([input_latent, in_label])
    merged = Dense(z_size)(merged)

    model_gen = layers.Reshape(target_shape=(1,z_size,))(merged)

    • Jason Brownlee 2021年1月26日上午5:54 #

      抱歉,我没有能力审查/调试您的代码,希望您能理解。

      也许您可以以本教程示例为起点,并将其改编到您的数据集上。

  27. Hamilton 2021年1月26日凌晨12:13 #

    嗨,

    当我尝试使用最终模型“如何生成服装项目”时

    我收到此错误消息

    USEMODELAC.py:23: MatplotlibDeprecationWarning: Passing non-integers as three-element position specification is deprecated since 3.3 and will be removed two minor releases later.
    pyplot.subplot(sqrt(n_examples), sqrt(n_examples), 1 + i)

    任何人或布朗利先生,你能帮我看看怎么做吗?

  28. Elias 2021年1月26日上午9:00 #

    你好,
    当我运行代码时,三个判别器的真实/虚假损失都为零,而类别分类器在三个都约为1.0。这是否是失败模式,即使我现在处于第3个epoch?我应该尝试更改哪些参数?

    • Jason Brownlee 2021年1月26日上午9:32 #

      可能是。

      也许继续训练并查看结果。
      也许尝试调整模型配置。
      也许尝试调整学习超参数。
      也许请确保您的库是最新的。

  29. Amal 2021年4月17日下午4:52 #

    哈喽 杰森,
    谢谢您的一切!
    我只是有一个问题。这是监督学习还是半监督学习?
    如果是半监督,那在这种情况下,未标记的数据在哪里?
    非常感谢。

    此致
    Amal

  30. Amal 2021年4月20日下午6:04 #

    半监督学习和这个模型有什么区别?我正在尝试做一个比较。
    谢谢

  31. Lucas Torlay 2021年7月14日晚上11:56 #

    嗨,Jason,

    这是一个非常有帮助的教程。我想问一下这个网络通常需要多少内存才能有效运行?

    我的生成器和判别器的参数数量很少,但它仍然似乎会耗尽内存。我确实有一个自定义实现,我的图像尺寸是原来的4倍,但即使批量大小为1,我仍然会耗尽内存。

    我同时使用两块GPU:Nvidia GTX 2060 和 2070。

    对于为什么我会在使用这个GAN网络时耗尽内存,但在标准CNN或自动编码器上却没问题,您有什么看法吗?

    感谢您所做的一切!

    卢卡斯

  32. Lucas Torlay 2021年7月15日凌晨1:42 #

    问题已经解决了!

    请忽略。

  33. Amrita 2021年8月26日下午3:18 #

    嗨,Jason,

    非常有启发性的例子。
    我的问题是,在计算生成器损失时,y_true 和 y_pred 分别是什么?
    我一直在尝试修改损失函数。它给出了不同的 y_true 和 y_pred 维度。
    您的回复将不胜感激。

    提前感谢

    • Adrian Tam
      Adrian Tam 2021年8月27日上午5:59 #

      损失函数本身不会改变维度(只有值会改变,因为您现在优化的是不同的东西),但改变模型输出会。您能检查一下吗?

  34. Amrita 2021年8月27日上午9:44 #

    你好 Adrian Tam,

    我没有添加新的输出;而是像ACGAN一样使用了binarycrossentropy和sparse categorical cross entropy。
    在添加自定义的sparse categorical cross entropy时,y_true 和 y_pred 分别是 (batch_size, 1) 和 (batchsize, no.of classes);我应用了对sparse CE的缩减,维度仍然是这样。

    然而,当我使用loss = [‘binary_crossentropy’, ‘sparse_categorical_crossentropy’]时,y_true 和 y_pred 的维度分别是 (batch_size, 1) 和 (batchsize, 1)。

    我无法确定这是否正确?

    • Adrian Tam
      Adrian Tam 2021年8月28日凌晨3:59 #

      那意味着您的 y_true 不是 one-hot 编码,而您的 y_pred 是。所以简单地,在将 y_true 输入损失函数之前进行转换就可以解决这个问题。

      • Amrita 2021年8月28日下午4:54 #

        好的,我现在明白了。
        谢谢您的帮助。

  35. Amir 2021年11月5日凌晨2:52 #

    网络的训练方式和损失函数完全错误。
    阅读ACgan文章,你就会发现这段代码是错误的。

  36. hammam 2021年12月4日凌晨3:25 #

    感谢您的教程。
    我一直在尝试将您的代码实现到1D数据集上,但我一直收到这个错误

    ValueError: Layer “model_30” expects 1 input(s), but it received 2 input tensors. Inputs received: [, ]

    有什么想法吗?

    Hammam

  37. hammam 2021年12月4日凌晨3:26 #

    ValueError: Layer “model_30” expects 1 input(s), but it received 2 input tensors. Inputs received: [, ]

    • Adrian Tam
      Adrian Tam 2021年12月8日凌晨7:16 #

      您肯定需要检查模型的输入尺寸。

  38. AM 2021年12月27日凌晨4:20 #

    嘿!如上所述,我一直在努力将这个GAN变成可以用于CIFAR-10数据库的东西。我认为我已经更改了所有相关部分,但我的模型在运行时一直遭受模式崩溃。我该如何避免这种情况?

    • James Carmichael 2021年12月27日上午10:49 #

      你好 AM…请参考以下内容

      https://machinelearning.org.cn/practical-guide-to-gan-failure-modes/

      • Jerry 2021年12月29日上午6:17 #

        你好 James,我遇到了和 AM 类似的问题(基于本教程的 CIFAR-10 AC-GAN 出现模式崩溃),我阅读了您推荐的文章。它似乎更侧重于识别模式崩溃(我已经完成了),而且我找不到任何解决它的技巧。有什么方法可以解决模式崩溃问题(如果这很重要,我使用了“使用辅助分类器GAN进行条件图像合成”中“如何定义AC-GAN模型”一节表格中建议的配置)?

        • James Carmichael 2022年2月28日下午12:14 #

          你好 Jerry…谢谢提问。

          我很想帮忙,但我实在没有能力为您调试代码。

          我很乐意提出一些建议

          考虑将代码积极削减到最低要求。这将帮助您隔离问题并专注于它。
          考虑将问题简化为一个或几个简单的例子。
          考虑寻找其他可行的类似代码示例,并慢慢修改它们以满足您的需求。这可能会暴露您的失误。
          考虑在 StackOverflow 上发布您的问题和代码。

  39. avinash 2022年6月20日凌晨12:44 #

    你好 James,

    很棒的作品,我只有一个问题:当我用我拥有11个类的数据集训练AC GAN时,然后我保存生成器模型并输出图像,当我给出类标签为2或2000时,它仍然会输出,这是怎么回事,因为我只有11个类?

    • James Carmichael 2022年6月20日上午11:40 #

      你好 Avinash…感谢您的反馈和支持!您能否重新措辞或详细说明您的问题,以便我们能更好地帮助您。也许您可以分享一个代码示例列表。

      • avinash 2022年6月22日下午6:29 #

        你好 James,谢谢回复。这对我意义重大。我的问题是:假设我训练我的ACGAN并保存我的生成器模型。现在我将使用我的生成器来生成图像,但我希望当我给出类标签为类2时,我的生成器应该生成类2的图像,但在我的情况下,即使我输入类标签2000(这是错误的,因为它只有11个类),它仍然会生成图像。它是如何表现成这样的?

  40. Bahar 2022年6月21日晚上8:52 #

    你好。感谢您的博文 Jason,在判别器中 `kernel_initializer = init` 是必需的吗?它在 ACGAN 中的存在原因是什么?

  41. Bahar 2022年6月21日晚上9:04 #

    在“CGAN 和 ACGAN 之间差异的总结”的图表中,我看到了一个从‘C’到‘X Real (data)’的定向箭头,在 CGAN 和 ACGAN 中都是如此。

    这是什么意思?
    也就是说,原始数据连同它们自己的原始标签一起进入判别器吗?

  42. avinash 2022年6月22日下午6:28 #

    你好 James,谢谢回复。这对我意义重大。我的问题是:假设我训练我的ACGAN并保存我的生成器模型。现在我将使用我的生成器来生成图像,但我希望当我给出类标签为类2时,我的生成器应该生成类2的图像,但在我的情况下,即使我输入类标签2000(这是错误的,因为它只有11个类),它仍然会生成图像。它是如何表现成这样的?

  43. Israa J. Saeed 2023年2月12日凌晨4:26 #

    我如何知道 GAN 的准确性?
    如何绘制 G-loss 和 D-loss?我无法添加 model.fit() 来绘制训练收敛的图。

  44. Naveed khan 2023年8月11日下午6:16 #

    HI,我该如何在 AC-GAN 中检测,如果您有其他链接,请分享。

    • James Carmichael 2023年8月12日上午9:54 #

      你好 Naveed…请说明“检测 AC-GAN”是什么意思,以便我们能更好地帮助您。

  45. Alex Lee 2023年11月28日下午6:01 #

    我不明白在 train() 中,您使用 gan_model 进行训练,但在 summarize_performance() 中使用 g_model,因为它只是在函数中传递,并没有训练任何东西,而 gan_model 被训练了但没有在任何地方使用?

  46. Alex Lee 2023年11月28日下午7:28 #

    你好,你能为我解释一下 train 函数吗?为什么 gan_model 被训练了,但 g_model 被用于 summarize_performance?因为 g_model 只是开始时创建的一个模型,在 train 函数中没有被训练,所以我很困惑。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。