图1:用名人脸部图像数据集训练出来的超分辨率像素递归模型所生成的高分辨率图像。左侧为测试数据集所用的8x8低分辨率输入图像。中间为PixelCNN模型所输出的32x32高分辨率图像,右侧是原始的32x32分辨率图像。我们的模型优先整合脸部特征,而后去合成较为逼真的头发与皮肤方面的细节。 由于在Google可以获取到无穷的计算资源,如何扩大训练的规模便成为该项目的另一个目标——因为即便采用这些小型的数据集,在单个CPU上完成训练也要花上数周的时间。 异步随机梯度下降算法(Asynchronous SGD)是最理想的分布式训练方法。使用这种方法,你用N台机器独立来训练同以个模型,但每个时间步长都要共享一次权重参数。权重参数被托管在一台单独的“参数服务器”上,该服务器在每个时间步长内都进行远程过程调用(RPC),以获得最新数值并发送梯度更新。如果数据管道足够好,你就可以线性增加模型每秒内的训练步数,方法是增加机器——因为机器之间互不依赖。然而,当机器增加时,由于老机器更新了权重,新机器的权重会逐步过期或“落伍”。在分类网络中,这里的问题不大,把训练的规模扩增到几十台机器不难。但PixelCNN却对过时的梯度极其敏感,在它的异步随机梯度下降算法内增加机器几乎没有任何收益。 另一个方法,是用同步随机梯度下降算法(Synchronous SGD)。使用这一方法,机器在每个时间步长内都进行同步,且每台机器的梯度都会被平均。它与随机梯度下降算法在数学上是相同的。更多的机器会增大批尺寸。但同步随机梯度下降算法(Sync SGD)允许各机器使用更小、更快的批尺寸,从而来增加每秒的步数(steps/sec)。然而,同步随机梯度下降算法也有它自己的问题。首先,它需要大量的机器经常进行同步,这必然导致停机时间的增加。其次,除非将每台机器的批尺寸设为1,否则它无法通过增加机器来增加每秒训练的步数。最终,我发现简单的设置是用一台机器安装8个GPU来使用同步随机梯度下降算法——但完成训练仍需花上数天的时间。 采用大规模计算的另一个办法,是进行规模更大的超参数搜索。如何来确定所用的批尺寸?把它们全都试一遍。在找到论文中所用的配置前,我尝试过数百种配置。 如何定量评估结果,则是另外一个难题。如何才能证明我们的图像比基准模型好?衡量超分辨率质量的典型方法,是对比强化图像与原始图像的对应像素点之间的距离(峰值信噪比,PSNR)。虽说本模型输出的脸部图像在质量上明显更好,但在像素对比上,平均看来它们还不如基准模型所输出的模糊图像。我们尝试用PixelCNN本身的相似度测量来证明我们的样本比基准版本有着更高的概率值,但同样失败了。最后,我们把这项任务众包给人类评估员——询问他们哪些图像看上去更真实。这倒奏效了。 具体的结果请查看这篇论文:超分辨率的像素递归:https://arxiv.org/abs/1702.00783 PixColor: 关于着色的尝试 PixColor输出的双色模式 Slim的创造者Sergio Guadarrama一直在尝试给图像着色。他跟我说过一个试验:用分量接口(该接口中图像的灰度、颜色相互分离)获取一张224×224×3的图像,将其颜色通道降至28×28×2的超低分辨率,然后用双线性插值法再把颜色通道放大,所得图像与颜色分辨率很高的原始图像相比几乎没有差别。 图3:你需要的只是一些颜色。顶行是原始彩色图像。中间行是降低采样率后的真实色度图像,尺寸缩小至28像素。底行是双线性提高中间行的采样率并结合原始灰度图像的结果。 这表明,把问题变成仅预测低分辨率颜色,我们就可以简化着色问题。我原本已准备好彻底放弃PixelCNN了,因为它显然无法放大小图像,但用来生成28×28×2的图像还是很可行的。通过将颜色数值简化为32个数字而非256,我们进一步简化了着色问题。 Sergio构建了一个“改进的”网络,它能够清理低分辨率颜色的输出,并将溢出边界的颜色推回至正确位置——使用前馈式图像对图像卷积神经网络进行训练,损失仅为L2。我们还用一个预训练好的ResNet作为条件网络,用以消解额外的损耗项需求,直播,毕竟在超分辨率项目中我们已经用过这样的损耗项。 使用这些方法后,无论是众包评估还是用颜色直方图相交评估,我们都能得出ImageNet上最好的结果。事实证明,经过正确训练的PixelCNN可以很好地模拟图像统计数据,不发生任何模式崩溃。 (责任编辑:本港台直播) |