使用Keras实现StackGAN

使用Keras实现StackGAN

StackGAN 论文的结果

“生成对抗网络(GAN)是过去十年机器学习中最有趣的想法。” - Yann LeCun,Facebook AI主任

深度学习领域的最新发展经常让我相信我们确实生活在激动人心的时刻。研究论文“ StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks ”,它提出了一种深度学习架构,能够根据给定文本创建逼真的图像。在本文中,我们将使用Keras重现这篇精彩研究论文的结果。

介绍

首先,让我们简单说明一些基本的术语,这些术语将有助于我们理解StackGAN的概念。

生成性对抗网络(GAN)由两个模型(Generator 和Discriminator)组成,它们被训练为彼此竞争。Generator生成对象的新实例,而Discriminator确定新实例是否属于实际数据集。

条件GAN是GAN的扩展,其中Generator和Discriminator都接收附加的条件变量c,其允许Generator生成以变量c为条件的图像。

让我们深入了解StackGAN。为便于阅读,本文分为以下几个小节:

  • StackGAN:文本到照片逼真的图像合成
  • StackGAN的模型体系结构
  • StackGAN研究论文的结果
  • 数据集的准备
  • StackGAN第一阶段的实现
  • StackGAN第二阶段的实现
  • 结论

在本文的最后,您将拥有一个工作模型来复制StackGAN研究论文的结果,从文本生成逼真的图像。此外,你还会了解如何在你的数据和问题声明中训练StackGAN。

StackGAN:文本到照片逼真的图像合成

我给你一个有趣的挑战,设计一个算法,从给定的文本生成照片般逼真的图像。

例:

(文字输入):The bird is black with green and has a very short beak

(输出 - 生成照片般逼真的图像):

使用Keras实现StackGAN

输入文字:The bird is black with green and has a very s

上面的鸟的图像不是由照相机拍摄的,而是由使用一种叫做StackGAN的深度学习架构的计算机创建的。StackGAN能够生成以文本描述为条件的256×256照片般逼真的图像。

这提出了一些重要的问题,“为什么StackGAN能够创建如此高维度的照片般逼真的图像呢?”,“StackGAN有什么不同呢?”

StackGAN通过草图优化过程将难题分解成更易于管理的子问题。Stage-I GAN根据给定的文本描述绘制对象的原始形状和颜色,生成Stage-I低分辨率图像。Stage ii GAN将阶段i的结果和文本描述作为输入,生成具有照片真实感细节的高分辨率图像。它能够纠正Stage-I结果中的缺陷,并在细化过程中添加引人注目的细节。

我强烈建议您阅读StackGAN研究论文:https://arxiv.org/pdf/1612.03242.pdf

StackGAN的模型体系结构

使用Keras实现StackGAN

StackGAN的模型体系结构

StackGAN的模型体系结构主要包括以下组件:

  • 嵌入:将输入的可变长度文本转换为固定长度向量。我们将采用预训练的字符级嵌入。
  • CA(Conditioning Augmentation
  • Stage I Generator:生成低分辨率(64 * 64)图像。
  • Stage I Discriminator
  • 残差块
  • Stage II Generator:生成高分辨率(256 * 256)图像。
  • Stage II Discriminator

本文的目的是使用Keras实现StackGAN。

StackGAN研究论文的结果

使用Keras实现StackGAN

我们的StackGAN,GAWWN和GAN-INT-CLS的示例结果取决于CUB测试集的文本描述

数据集的准备

我们正在CUB数据集上训练我们的神经网络模型。CUB包含200种鸟类,11788张图片。由于该数据集中80%的鸟类的对象图像大小比小于0.5,作为预处理步骤,我们对所有图像进行裁剪,以确保鸟类的边框具有大于0.75的对象图像大小比。

我们先下载数据集:

https://drive.google.com/open?id=0B3y_msrWZaXLT1BZdVdycDY5TEE - 下载birds.zip文件并将其解压缩。

使用命令或链接中的目录下载CUB数据集并将其解压缩到根目录中 。

下载CUB机器学习数据集

http://www.vision.caltech.edu/visipedia-data/CUB-200-2011/CUB_200_2011.tgz

此外,创建两个空文件夹logs(您的神经网络模型日志将保存在此处)和results(从我们的第I阶段StackGAN生成的图像)​​。

现在,您的目录应如下所示:

使用Keras实现StackGAN

目录

  • CUB_200_2011 - 有关数据集的更多信息,请访问:http://www.vision.caltech.edu/visipedia/CUB-200.html
  • char-CNN-RNN-embeddings.pickle - 预训练嵌入文本的Dataframe。
  • filenames.pickle - 包含图像文件名的Dataframe。
  • class_info.pickle - 包含每个图像的类信息的Dataframe。

在训练过程中,discriminator将真实图像及其对应的文本描述作为正样本对。将嵌入不匹配文本的真实图像和嵌入相应文本的合成图像视为负样本对。

Stage I of StackGAN的实现

让我们首先实现StackGAN的Stage I。如模型体系结构所示,StackGAN的Stage I将输入视为文本,我们使用预训练的字符级嵌入将文本转换为嵌入。然后,我们将此嵌入提供给CA,然后再提供给Stage I 的Generator,它为我们提供了低分辨率的64 * 64图像。我们创建生成的图像和原始图像的表示,并将其与嵌入连接,以训练Stage I 的discriminator。这是Stage I GAN的非常粗略的描述。

我们先导入一些Python库

使用Keras实现StackGAN

现在,让我们编写一些函数来加载我们的机器学习数据集:

使用Keras实现StackGAN

使用Keras实现StackGAN

现在,我们构建了Stage I架构

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

现在,让我们为我们的KL损失写一个函数:

使用Keras实现StackGAN

现在,我们编写了一些函数,用于在每2个epochs后保存生成的图像并保存日志。

使用Keras实现StackGAN

让我们编写主函数来初始化超参数并训练我们的stage I StackGAN。

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

模型训练

在完成Stage I StackGAN的训练之后,将在目录中创建两个新文件,命名为stage1_gen.h5和stage1_dis.h5,分别代表Stage I 生成模型训练权重和Stage I discriminator模型训练权重。

您还可以在results文件夹中查看Stage I StackGAN生成的图像,并在logs文件夹中查看日志。

注意:Stage I StackGAN的培训将花费大量时间。

Stage II of StackGAN的实现

让我们实现我们的Stage II StackGAN。下面的Python代码与Stage I StackGAN非常相似。如果您能够理解Stage I 的GAN,您将很容易理解。

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

现在让我们定义我们的超参数并训练我们的模型。

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

使用Keras实现StackGAN

Stage II StackGAN的结果

如果出现OOM错误,请减少batch_size,因为系统没有足够的内存来执行操作。

结论

我希望你现在能够训练你的StackGAN模型。StackGAN是一个强大的概念,他们能够从文本中创建这样的照片般逼真的图像,这简直令人难以置信。

相关推荐