投稿/爆料
厂商入驻

CIFAR-10之蛙

论智|2018-01-29 16:31

【编者按】Google Brain机器学习开发者hardmaru使用TensorFlow,将之前绘制高分辨率MNIST数字的CPPN+GAN+VAE模型推广到了CIFAR-10的彩色图像之上。

CPPN CIFAR-10 frog

在CIFAR-10的青蛙分类上训练的CPPN网络生成的图像。同一网络可生成30x30与1080x1080分辨率的图像

介绍

上一篇文章中,我们创建了一个能够以非常高的图像分辨率绘制MNIST数字的生成式模型,该模型基于表示图像的潜向量空间。生成网络使用CPPN模型生成任意指定分辨率的图像。本文将把这一模型应用到CIFAR-10数据集。

仍然有许多需要做的事,因为目前的模型还不怎么适合生成彩色图像。但我认为看看当前的模型能生成什么样的东西会很有意思。当前,模型趋向于抽取图像的一些状态,所以VAE的编码函数的效果不是很好,因为训练集中的图像太多样化了,这个模型很难应付。

探索不同的生成式架构

CPPN的架构限制了网络可能绘制的图像种类。不同的架构对应不同种类的生成图像,尽管这些架构都是在相似的数据集上训练的。

因此,除了修改原本的MNIST模型的输出回归,用3个输出取代1个输出,以建模色彩外,我们同时也尝试了许多生成式网络的不同架构。同时,使用现有的模型在整个CIFAR-10数据上进行训练效果不会好,因为CIFAR-10包含了类别广泛的图像,从飞机、轮船到鸟类、青蛙。下面是在整个CIFAR-10数据集上训练我们的模型后生成的一个有趣的样本。

抽象CIFAR-10

抽象CIFAR-10?

我们注意到,这张图像不像基于纯随机权重的CPPN网络生成的图像那样随机,然而这张图像并没有重现什么东西,除非你真的可以解读这样一张图像的抽象解释(那你可以成为一名艺术评论家!)。我们可以尝试训练CIFAR-10中的某类图片,看看运气会不会好一点。或者至少尝试让模型刻画一些典型的结构,例如我们在某个特定分类中看到的色彩和形状。

在我们的试验中,我们尝试使用了不同的架构(model.pygenerator类)。例如,我们把生成网络的每一层设置为tanh

H = tf.nn.tanh(U)

for i in range(1, self.net_depth_g):
  H = tf.nn.tanh(fully_connected(H, n_network, self.model_name+'_g_tanh_'+str(i)))

output = tf.nn.sigmoid(fully_connected(H, self.c_dim, self.model_name+'_g_'+str(self.net_depth_g)))

下面的图像是由纯用tanh构成的8个网络层生成的,模型在CIFAR-10的青蛙分类上训练。我们可以看到,曲线和平面很平滑。然而,这样的模型倾向于不稳定,因为tanh网络的10个网络层没法像GAN训练中那样很好地处理梯度。

两栖动物的起源

两栖动物的起源(2016)

我尝试把第一层改成了relu层,给生成网络加上了一点结构和刚性,然后在CIFAR-10的卡车分类上训练了模型,看看能得到什么样的图像。

H = tf.nn.relu(U)

for i in range(1, self.net_depth_g):
  H = tf.nn.tanh(fully_connected(H, n_network, self.model_name+'_g_tanh_'+str(i)))

output = tf.nn.sigmoid(fully_connected(H, self.c_dim, self.model_name+'_g_'+str(self.net_depth_g)))

下面是这种网络生成的图像当中很酷的一个样本。我们可以,由于网络以relu层开始,图像中有一些结构和硬线。

地形

地形(2016)

我喜欢relu层带来的结构性效果,但同时我不想牺牲sigmoid类激活提供的平滑性,所以我尝试调整这个架构,并决定使用重复的relutanh组合来训练CIFAR-10数据集中的青蛙图像。

H = tf.nn.relu(U)

for i in range(1, self.net_depth_g):
  H = tf.nn.tanh(fully_connected(H, n_network, self.model_name+'_g_tanh_'+str(i)))
  H = tf.nn.relu(fully_connected(H, n_network, self.model_name+'_g_relu_'+str(i)))

output = tf.nn.sigmoid(fully_connected(H, self.c_dim, self.model_name+'_g_'+str(self.net_depth_g)))

现在让我们看看这一架构是如何建模CIFAR-10中的一个子分类的。

CIFAR-10 青蛙

CIFAR-10 青蛙

CIFAR-10中的图像尺寸为32x32像素。我们略加裁切,得到30x30像素的训练图像。此外,我们在训练中随机水平翻转图像,这样可以增加每个分类中数量较少的数据的有用程度(训练集与测试集中共有6000张青蛙图片)。

CIFAR-10的青蛙分类中的一些样本:

CIFAR-10青蛙分类样本

在青蛙数据集上训练好修改过的CPPN-GAN-VAE模型之后,我们可以从模型中取样一些图像,看看它们看起来是什么样的:

CPPN青蛙样本

我们看到,上面的样本某种程度上重现了某种两栖类的生物,其中有一些颜色的渐变和纹理看起来和样本集中的部分图像很类似,但显然我们还有很长的路要走。青蛙的丰富的色彩类型和很多不同的风格都丢失了。然而,我们可以尝试升采样图像到1080x1080,看看这些像素化的样本在高解析度下看起来是什么样的。

CPPN高解析度青蛙

我觉得这些高解析度的版本比单纯使用随机权重的生成网络生成的图像要更有趣。至少它看起来像是在试图传达某种主题或情绪。

模型的青蛙图像空间相当有限

CIFAR-10 卡车

CIFAR-10 卡车

CIFAR-10 卡车

我也尝试过在CIFAR-10数据的卡车分类上训练这个模型。此外,我还试过移除CPPN的半径输入R,这样输入就只剩下潜向量和x、y坐标,(Z, X, Y)。我发现有时候半径限制了生成图像空间的类型,尽管它无偿赠予了我们曲线效果。

下面是在卡车分类上训练后生成的图像的一些样本。在卡车分类上训练后,CPPN的颜色空间和在青蛙分类上训练的有所不同。可能是因为卡车的训练数据包含更多橙色、红色、亮色。

CPPN CIFAR卡车样本

30x30和1080x1080分辨率下的CPPN CIFAR卡车样本

我还尝试使用VAE编码器编码原始样本到有限的潜空间,看看CPPN可以生成什么样的表示。显然空间太受限了,但是有意思的是网络成功刻画了一些特征。

编码原始样本

正如我们所见,模型可以生成的图像的种类很有限,对于传入自动编码器的每个输入样本而言,模型试图选取最密切的状态。

结论

要让这类CPPN网络能够生成比简单的MNIST数字更为丰富的图像,还有许多工作要做。我认为使它们能够生成色彩丰富的图像是有一定价值的,因为这类网络允许我们升采样到非常高的分辨率。我考虑过一些在以后值得尝试的事情:

  • 将VAE编码器网络从一个简单的全连接双层softplus网络修改为一个能够以空间不变的方式更好地识别图像特征的更深的卷积神经网络。

  • 在图像的离散余弦变换版本上训练网络,让网络生成新图像的离散余弦变换表示,然后再把表示转换成空间上的表示。

  • 修改生成网络,以利用残差/随机层进行训练。让10层以上的网络学习已被证明非常具有挑战性。任何dropout处的尝试都会使网络生成非常模糊的图像。

  • 将生成网络中的全连接层替换为稀疏连接层,或卷积神经网络类的连接。尝试使用DCGAN类的架构,不过生成网络起类似CPPN的作用。

我把相关代码发布在GitHub上,因为你也许会想尝试在彩色图像上训练CPPN。这些代码修改了先前用于生成高分辨率MNIST图像的CPPN-GAN-VAE模型,以便在CIFAR-10上进行训练。它有点七拼八凑的感觉,我对发布这种质量的代码有点羞耻,但我希望你能比我做出更棒的东西!

如果你用它绘制出了有趣的东西,请告诉我。

原文 The Frog of CIFAR 10
感谢原作者hardmaru授权论智编译,未经授权禁止转载。详情见转载须知

本文来自机器人之家,如若转载,请注明出处:https://www.jqr.com/article/000013
爆料投稿,欢迎投递至邮箱:service@jqr.com
机器学习人工智能
推荐阅读

最新评论(0

暂无回帖,快来抢沙发吧

评论

游客
robot
发布需求
联系客服联系客服
robot
联系客服