我正在处理一个问题,我找不到足够的数据集(图像)来输入我的深度神经网络进行训练。
Scott Reed 等人发表的论文Generative Adversarial Text to Image Synthesis让我深受启发。关于生成对抗网络。
我很想知道,我可以使用可用的小数据集作为 GAN 模型的输入并生成更大的数据集来处理更深层次的网络模型吗?
会足够好吗?
我正在处理一个问题,我找不到足够的数据集(图像)来输入我的深度神经网络进行训练。
Scott Reed 等人发表的论文Generative Adversarial Text to Image Synthesis让我深受启发。关于生成对抗网络。
我很想知道,我可以使用可用的小数据集作为 GAN 模型的输入并生成更大的数据集来处理更深层次的网络模型吗?
会足够好吗?
这不太可能超出您的直接数据收集工作。
当前 GAN 输出的质量(截至 2017 年)还不够高。GAN 生成的图像通常很小,并且可能具有不寻常/模棱两可的细节和奇怪的失真。在您链接的论文中,系统从句子中生成的图像在给定主题的情况下具有可信的色块,但如果没有句子启动您的预期,它们中的大多数都无法识别为任何特定主题。
与从句子生成图像相比,GAN 的目标没有那么雄心勃勃(尽管我在上面提出了批评,但 IMO 确实是一项了不起的壮举)应该产生更接近照片般逼真的图像。但是它们的范围会更小,并且可能不包括您想要的图像类型。此外,通常输出尺寸很小,例如 64x64 或 128x128*,并且仍然存在足够的失真和模糊性,原始地面实况照片会更可取。
GAN 本身受到可用训练库的限制——如果您尝试生成超出其训练数据范围的图像,它就不会做得很好。研究论文中显示的结果当然集中在训练数据提供的领域。但是你不能仅仅将任何句子输入这个模型并期望得到在其他地方有用的结果。
如果您发现 GAN 已针对您的问题在合适的数据集上进行了训练,那么您最好尝试直接为您的项目获取相同的数据。
如果您面临地面实况数据有限的问题,那么使用 GAN 的更好方法可能是使用预训练的分类器,例如 VGG-19 或 Inception v5,替换最后几个全连接层,就可以了根据您的数据进行调整。这是在 Python 中使用 Keras 库执行此操作的示例- 可以通过“微调 CNN 图像分类器”等搜索找到其他示例。
* 自从我发布这个答案以来,最先进的 GAN 变得更好了。Nvidia 的一个研究团队在创建 1024x1024 逼真的图像方面取得了显著成功。但是,这不会改变我回答中的其他观点。GAN 不是图像分类任务的可靠图像来源,除非 GAN 已经接受过训练并且能够有条件地生成(或者更简单地说,为“其他”类别提供源数据的子任务)分类器)。
我目前正在构建的 DNN 存在完全相同的问题。使用我的数据集并用 GAN 合成新数据似乎是个好主意。但是 GAN 本身只会学习输出具有与训练集中学习到的相同图像方差和标准差的图像。因此,您新生成的数据将仅代表相同样本分布的更多排列。这将帮助您的 NN 在相同分布上更好地训练,因此可能会导致更大的过度训练。
仅从纯理论的角度来看,这是不可能的。
任何给定的训练数据集都代表一定数量的关于特定空间结构的信息。如果你在这个数据集上训练一个 GAN,它只会从那个数据集所代表的信息中学习。GAN 合成的数据永远不会来自比原始数据更大的空间,原因很简单:这些信息应该来自哪里?如果它不在原始数据集中,那么它也不能在来自 GAN 的合成数据中。
如果您训练神经网络在数据集上收敛,则该神经网络将学习数据集包含的任何结构。GAN 合成的任何人工训练数据都不会添加新信息。这个想法应该是直截了当的。
实际上,可以使用 GAN 来扩充一个小型数据集来改进它,它还将提高分类网络的性能,如您在此处阅读的那样。
GAN 能够学习例如原始数据集中不涉及但仍然有效的中间形状。因此合成图像确实可以提高数据集大小并提高 CNN 分类精度。