编译 | sunlei
神经风格转换是卷积神经网络最具创造性的应用之一。神经网络通过获取内容图像和风格图像,将内容和风格图像进行重组,有效地创造出艺术图像!
这些算法非常灵活,内容和风格用无限可能的组合产生了非常有创意和独特的结果。
事实上,一家公司优化了算法并发布了一个名为Prisma的移动应用程序,它使用神经风格转换将艺术风格应用于你的手机拍摄的照片上!
在本文中,我们将重新创建Gatys等人提出的算法,以实现上述类似结果。请注意,我使用的是笔记本电脑,因此如果您使用的是CPU更好的台式机,结果可能略有不同。
和平时一样,如果你被卡住了,可以随时查阅完整的笔记本。
我们开始吧!
此嵌入内容来自不符合浏览器上已启用的不跟踪(DNT)设置的站点。
请注意,如果你点击并查看它,你可能会被网站托管嵌入跟踪。
第一步:加载VGG – 19
从头开始构建算法需要大量的时间和计算能力,这对每个人来说都不是能轻松获得的。
相反,我们将加载现有网络的权重以实现神经风格的传输。
将神经网络用于不同目的的过程称为转移学习。
让我们这样加载模型:
太棒了!现在,我将用一张卢浮宫的图片作为内容图片。
你可以加载任何你想要的图片,但要确保图片不要太大:
在我的例子中,输出如下:
第二步:定义内容代价函数
为了使我们的算法生成优质的图像,我们需要确保生成的图像的内容与输入图像的内容匹配。
换句话说,生成的图像也应该有金字塔、周围的建筑物、云、太阳等。
因此,我们希望生成的图像和内容图像的层激活相似。因此,内容代价函数可以定义为:
由上面公式可知,n_H和n_W分别是图像的高度和宽度,其中n_c是隐藏层中的通道数。
为了计算成本,将三维体积展开为二维矩阵更有效,因为这将加快计算速度。
展开卷积层以计算成本
现在,我们对这个逻辑进行编码:
第三步:定义样式代价函数
现在,我们需要一个样式图像。在我的例子中,我将使用莫奈的印象派作品,但可以自由使用任何其他类型的艺术:
谁能告诉我这幅画的名字?
与内容代价函数相比,定义样式代价函数是一个稍微复杂一些的过程。我们把它分成几个小部分。
3.1定义Gram矩阵
样式矩阵也称为Gram矩阵,它表示一组向量的点积。
这就捕获了每个向量之间的相似性,因为如果两个向量彼此相似,那么它们的点积将很大,因此Gram矩阵也将很大。
这就是Gram矩阵如何有效地测量图像的样式。
把它变成代码:
3.2定义样式成本
现在,我们要确保生成的图像和样式图像的样式相似。
换句话说,我们想要最小化两个Gram矩阵之间的距离。这表示为:
对逻辑进行编码:
3.3指定样式权重
在前面的步骤中,我们只捕获了单层的样式成本。
将所有图层的样式成本结合起来生成更好的图像是有用的。
在数学上,样式成本变成:
其中lambda是每层的权重。
因此,我们添加此代码单元:
3.4把一切结合起来
现在,我们简单地将所有东西组合成一个统一样式的代价函数:
第四步:定义总代价函数
既然我们有了内容和样式的代价函数,我们就可以将两者结合起来,得到一个总代价函数,该函数将被优化:
其中alpha和beta是任意权重。
第五步:解决优化问题,生成图像
现在,最棒的部分来了!一切就绪,我们就可以解决优化问题,生成一个艺术形象!
在我的例子中,我得到了以下结果:
当然,如果你用更长的时间和更快的学习速度来训练网络,你可以得到更好的结果。
恭喜你!你刚刚在TensorFlow中执行了神经风格转换!你可以使用迭代次数和学习速度尝试随时改变内容和风格形象。这就是你今天的收获,满意吗?
End
领取专属 10元无门槛券
私享最新 技术干货