用TensorFlow实现神经网络画风迁移

栏目: 数据库 · 发布时间: 5年前

内容简介:重磅干货,第一时间送达编译 | sunlei

点击上方“ Python数据科学 ”,选择“星标”公众号

重磅干货,第一时间送达

编译 | sunlei  发布 | ATYUN订阅号

用TensorFlow实现神经网络画风迁移

神经风格转换是卷积神经网络最具创造性的应用之一。神经网络通过获取内容图像和风格图像,将内容和风格图像进行重组,有效地创造出艺术图像!

这些算法非常灵活,内容和风格用无限可能的组合产生了非常有创意和独特的结果。

用TensorFlow实现神经网络画风迁移

事实上,一家公司优化了算法并发布了一个名为Prisma的移动应用程序,它使用神经风格转换将艺术风格应用于你的手机拍摄的照片上!

用TensorFlow实现神经网络画风迁移

在本文中,我们将重新创建Gatys等人提出的算法,以实现上述类似结果。请注意,我使用的是笔记本电脑,因此如果您使用的是CPU更好的台式机,结果可能略有不同。

和平时一样,如果你被卡住了,可以随时查阅完整的笔记本。

我们开始吧!

此嵌入内容来自不符合浏览器上已启用的不跟踪(DNT)设置的站点。

请注意,如果你点击并查看它,你可能会被网站托管嵌入跟踪。

第一步:加载VGG – 19

从头开始构建算法需要大量的时间和计算能力,这对每个人来说都不是能轻松获得的。

相反,我们将加载现有网络的权重以实现神经风格的传输。

将神经网络用于不同目的的过程称为转移学习。

让我们这样加载模型:

1model = load_vgg_model(“pretrained-model/imagenet-vggverydeep-19.mat”)

太棒了!现在,我将用一张卢浮宫的图片作为内容图片。

你可以加载任何你想要的图片,但要确保图片不要太大:

1content_image = scipy.misc.imread(“images/louvre.jpg”)
2imshow(content_image)

在我的例子中,输出如下:

用TensorFlow实现神经网络画风迁移

第二步:定义内容代价函数

为了使我们的算法生成优质的图像,我们需要确保生成的图像的内容与输入图像的内容匹配。

换句话说,生成的图像也应该有金字塔、周围的建筑物、云、太阳等。

因此,我们希望生成的图像和内容图像的层激活相似。因此,内容代价函数可以定义为:

用TensorFlow实现神经网络画风迁移

由上面公式可知,n_H和n_W分别是图像的高度和宽度,其中n_c是隐藏层中的通道数。

为了计算成本,将三维体积展开为二维矩阵更有效,因为这将加快计算速度。

用TensorFlow实现神经网络画风迁移 展开卷积层以计算成本

现在,我们对这个逻辑进行编码:

用TensorFlow实现神经网络画风迁移

第三步:定义样式代价函数

现在,我们需要一个样式图像。在我的例子中,我将使用莫奈的印象派作品,但可以自由使用任何其他类型的艺术:

用TensorFlow实现神经网络画风迁移 谁能告诉我这幅画的名字?

与内容代价函数相比,定义样式代价函数是一个稍微复杂一些的过程。我们把它分成几个小部分。

3.1定义Gram矩阵

样式矩阵也称为Gram矩阵,它表示一组向量的点积。

这就捕获了每个向量之间的相似性,因为如果两个向量彼此相似,那么它们的点积将很大,因此Gram矩阵也将很大。

用TensorFlow实现神经网络画风迁移

这就是Gram矩阵如何有效地测量图像的样式。

把它变成代码:

用TensorFlow实现神经网络画风迁移

3.2定义样式成本

现在,我们要确保生成的图像和样式图像的样式相似。

换句话说,我们想要最小化两个Gram矩阵之间的距离。这表示为:

用TensorFlow实现神经网络画风迁移

对逻辑进行编码:

用TensorFlow实现神经网络画风迁移

3.3指定样式权重

在前面的步骤中,我们只捕获了单层的样式成本。

将所有图层的样式成本结合起来生成更好的图像是有用的。

在数学上,样式成本变成:

用TensorFlow实现神经网络画风迁移

其中lambda是每层的权重。

因此,我们添加此代码单元:

用TensorFlow实现神经网络画风迁移

3.4把一切结合起来

现在,我们简单地将所有东西组合成一个统一样式的代价函数:

用TensorFlow实现神经网络画风迁移

第四步:定义总代价函数

既然我们有了内容和样式的代价函数,我们就可以将两者结合起来,得到一个总代价函数,该函数将被优化:

其中alpha和beta是任意权重。

用TensorFlow实现神经网络画风迁移

第五步:解决优化问题,生成图像

现在,最棒的部分来了!一切就绪,我们就可以解决优化问题,生成一个艺术形象!

 1# Reset the graph
 2tf.reset_default_graph()
 3
 4# Start interactive session
 5sess = tf.InteractiveSession()
 6
 7content_image = scipy.misc.imread("images/louvre_small
 8content_image = reshape_and_normalize_image(content_im
 9
10style_image = scipy.misc.imread("images/monet.jpg")
11style_image = reshape_and_normalize_image(style_image)
12
13model = load_vgg_model("weights/imagenet-vgg-verydeep-
14
15# Assign the content image to be the input of the VGG
16sess.run(model['input'].assign(content_image))
17
18# Select the output tensor of layer conv4_2
19out = model['conv4_2']
20
21# Set a_C to be the hidden layer activation from the l
22a_C = sess.run(out)
23
24# Set a_G to be the hidden layer activation from same
25# and isn't evaluated yet. Later in the code, we'll as
26# when we run the session, this will be the activation
27a_G = out
28
29# Compute the content cost
30J_content = compute_content_cost(a_C, a_G)
31
32# Assign the input of the model to be the "style" imag
33sess.run(model['input'].assign(style_image))
34
35# Compute the style cost
36J_style = compute_style_cost(model, STYLE_LAYERS)
37
38J = total_cost(J_content,J_style,alpha=10,beta=40)
39
40# define optimizer
41optimizer = tf.train.AdamOptimizer(2.0)
42
43# define train_step
44train_step = optimizer.minimize(J)
45
46def model_nn(sess, input_image, num_iterations = 200):
47
48# Initialize global variables (you need to run the
49sess.run(tf.global_variables_initializer())

在我的例子中,我得到了以下结果:

用TensorFlow实现神经网络画风迁移

当然,如果你用更长的时间和更快的学习速度来训练网络,你可以得到更好的结果。

恭喜你!你刚刚在TensorFlow中执行了神经风格转换!你可以使用迭代次数和学习速度尝试随时改变内容和风格形象。这就是你今天的收获,满意吗?

专注于数据科学领域的知识分享

欢迎在文章下方留言与交流

推荐阅读

越来越像 Linux 了!Windows 系统 5 月更新让 Python 开箱即用

李宏毅:1 天搞懂深度学习,我总结了 300 页 PPT(附思维导图)

数据可视化图表,你选对了吗?

干货 | 19款最好用的免费数据挖掘 工具 大汇总

Python排序傻傻分不清?一文看透sorted与sort用法

用TensorFlow实现神经网络画风迁移

觉得不错,不妨点个 好看 :heart:


以上所述就是小编给大家介绍的《用TensorFlow实现神经网络画风迁移》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java夜未眠

Java夜未眠

蔡学镛 / 电子工业出版社 / 2003-4 / 20.00元

本书是一本散文集。作为一名资深程序设计师,作者走笔清新面独特,简练俏皮的文字下,是作者对工作,对人生的理性思考。书中收录的文章内容贴近程序员的生活,能令读者产生强烈共鸣。此外,书中的部分文章也以轻松的风格剖析了学习Java技术时的常见问题,并以专家眼光和经验推荐介绍了一批优秀的技术书籍,旨在帮助读者兴趣盎然地学习Java。一起来看看 《Java夜未眠》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具