如何用 TensorFlow 生成令人惊艳的分形图案

2017 年 9 月 12 日 AI研习社 AI 科技评论

本文作者

何之源

,原文载于知乎专栏 

AI Insight

,AI研习社获其授权发布。


今天来介绍一个小项目:在 TensorFlow 中生成分形图案。分形本身只是一个数学概念,与机器学习并无太大关系,但是通过分形的生成,我们可以了解怎么在 TensorFlow 中进行数学计算,以及如何进行基本的流程控制,是学习 TensorFlow 的一个非常好的练手项目。

在开始之前,需要说明的是,TensorFlow 官方也提供了一个生成分形图案的教程 (地址: www.tensorflow.org/tutorials/mandelbrot),然而官方教程中生成的图像实在是太丑了,而且只能生成一种图案,我对官方的代码做了一些改进,并且加入了多种类型的分形,此外,不仅可以生成图像,还可以制作 gif 动画,代码已经放到了 Github 上:https://github.com/hzy46/tensorflow-fractal-playground,主要的程序只有 50 行,欢迎大家参考。

  Mandelbrot 集合

Mandelbrot 集合是分形中最经典的一个例子。考虑迭代公式  (z 和 c 都是复数)。当为 0 时,得到的值可以组成一个数列,依次为。当该数列发散到无穷时,对应的点就属于 Mandelbrot 集合。

时,显然数列永远是 0,并不发散,因此 0 不属于 Mandelbrot 集合。

又如时,对应的数列为,数字越来越庞大,因此 3i 就属于 Mandelbrot 集合。

在二维平面上,将所有不属于 Mandelbrot 集合的点标记为黑色,将所有属于 Mandelbrot 集合的点按照其发散速度赋予不同的颜色,就可以得到 Mandelbrot 的经典图像:

上面这张图完全是使用 TensorFlow 进行计算的,类似的图大家应该在网上也见过好多了,在 TensorFlow 中,我们定义下面的计算步骤:

xs = tf.constant(Z.astype(np.complex64))

zs = tf.Variable(xs)

ns = tf.Variable(tf.zeros_like(xs, tf.float32)) with tf.Session():
   tf.global_variables_initializer().run()
   zs_ = tf.where(tf.abs(zs) < R, zs**2 + xs, zs)
   not_diverged = tf.abs(zs_) < R
   step = tf.group(
       zs.assign(zs_),
       ns.assign_add(tf.cast(not_diverged, tf.float32)) 
   for i in range(ITER_NUM): step.run()
   final_step = ns.eval()
   final_z = zs_.eval()

zs 就对应我们之前迭代公式的 z,而 xs 就对应迭代公式中的 c。为了方便起见,只要计算时数值的绝对值大于一个事先指定的值 R,就认为其发散。每次计算使用 tf.where 只对还未发散的值进行计算。结合 ns 和 zs_就可以计算颜色,得到经典的 Mandelbrot 图像。

  Julia 集合

Julia 集合和 Mandelbrot 集合差不多,但这次我们固定 c,转而计算发散的 z 的值。即 c 是固定的常数(可以任取),数列变成。如果该数列发散,对应的 z 就属于 Julia 集合。对此,我们只要在原来的程序中修改两行内容,就可以生成 Julia 集合:

xs = tf.constant(np.full(shape=Z.shape, fill_value=c, dtype=Z.dtype))

zs = tf.Variable(Z)

我们在 fill_value=c 处指定了 Julia 集合中的 c 值,只要使用不同的 c 值,就可以生成完全不同的 Julia 集合!

默认:

将 c 值变为,并调整颜色(调整方法参考 Github 页面的说明):

选用,图案又变得完全不同:

  生成 Julia 集合的动画

在 Julia 集合中,每次都对 c 的值进行微小的改变,并将依次生成图片制作为 gif,就可以生成如下所示的动画,对应的代码为 julia_gif.py:

这里由于上传 gif 有大小限制的关系,只展示了一个小尺寸的动画图像。程序中提供了一个 width 参数,可以修改它以生成更大尺寸,质量更高的动画图像。

  探索 Mandelbrot 集合

(注意:下面的图片可能对密集恐惧症患者不太友好。。。因此慎重翻页。。)

在前面生成的 Mandelbrot 集合中,我们可以将图像放大,选取某些区域进行生成,就可以得到格式各样造型迥异的分形图案,对应的程序为 mandelbrot_area.py。

在 Mandelbrot 集合中,有很多地方图案比较奇特,如下图中的 9 个位置。


其中编号为 2 的地方被称为 “Elephant Valley”,因为此处的图案与大象很像,直接运行 mandelbrot_area.py 就可以得到该区域的图像:

编号为 3 的地方被称为 “Triple Spiral Valley”(三重螺旋),在 mandelbrot_area.py 修改一下坐标位置为 (ratio 调整的是颜色):

start_x = -0.090  # x range

end_x = -0.086

start_y = 0.654  # y range

end_y = 0.657

width = 1000

ratio1, ratio2, ratio3 = 0.2, 0.6, 0.6

就可以得到该处的图案:

最后编号为 1 的地方被称为 “Seahorse Valley”(海马山谷),对应的坐标为:

start_x = -0.750  # x range

end_x = -0.747

start_y = 0.099  # y range

end_y = 0.102

width = 1000

ratio1, ratio2, ratio3 = 0.1, 0.1, 0.3

图像如下,确实和海马有一点神似:

  生成更多的图案

项目提供了两个 jupyter notebook:Mandelbrot.ipynb 和 Julia.ipynb 可以对 Mandelbrot 集合、Julia 集合做更方便的探索。其中,Mandelbrot 集的更多坐标位置可以参考 Quick Guide to the Mandelbrot Set(http://www.nahee.com/Derbyshire/manguide.html),Julia 集中更多有趣的 c 值可以参考 Julia set - Wikipedia(https://en.wikipedia.org/wiki/Julia_set#Quadratic_polynomials)。网上类似的资源还有很多。

最后再安利一下项目地址:https://github.com/hzy46/tensorflow-fractal-playground。如果代码有什么问题可以直接发在评论里或者在 Github 上提出 issue:)

AI 研习社长期接受优秀文章投稿

同时免费为优质企业推广招聘信息

有意者请联系 jiazhilong@leiphone.com



后台回复 “我要进群” 加入 AI 技术讨论群 



新人福利



关注 AI 研习社(okweiwu),回复  1  领取

【超过 1000G 神经网络 / AI / 大数据,教程,论文】



如何使用高大上的方法调参数

▼▼▼

登录查看更多
1

相关内容

Google发布的第二代深度学习系统TensorFlow
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
谷歌机器学习速成课程中文版pdf
专知会员服务
145+阅读 · 2019年12月4日
【干货】谷歌Joshua Gordon 《TensorFlow 2.0讲解》,63页PPT
专知会员服务
27+阅读 · 2019年11月2日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
从零开始深度学习第8讲:利用Tensorflow搭建神经网络
如何使用注意力模型生成图像描述?
AI研习社
9+阅读 · 2018年8月6日
CNN图像风格迁移的原理及TensorFlow实现
数据挖掘入门与实战
5+阅读 · 2018年4月18日
风格迁移原理及tensorflow实现-附代码
机器学习研究会
19+阅读 · 2018年3月25日
TensorFlow实例: 手写汉字识别
数据挖掘入门与实战
11+阅读 · 2017年11月10日
在TensorFlow中对比两大生成模型:VAE与GAN
机器之心
12+阅读 · 2017年10月23日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
Reasoning on Knowledge Graphs with Debate Dynamics
Arxiv
14+阅读 · 2020年1月2日
Arxiv
5+阅读 · 2018年10月23日
Arxiv
3+阅读 · 2018年3月21日
Arxiv
4+阅读 · 2017年11月14日
VIP会员
相关VIP内容
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
谷歌机器学习速成课程中文版pdf
专知会员服务
145+阅读 · 2019年12月4日
【干货】谷歌Joshua Gordon 《TensorFlow 2.0讲解》,63页PPT
专知会员服务
27+阅读 · 2019年11月2日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
相关资讯
从零开始深度学习第8讲:利用Tensorflow搭建神经网络
如何使用注意力模型生成图像描述?
AI研习社
9+阅读 · 2018年8月6日
CNN图像风格迁移的原理及TensorFlow实现
数据挖掘入门与实战
5+阅读 · 2018年4月18日
风格迁移原理及tensorflow实现-附代码
机器学习研究会
19+阅读 · 2018年3月25日
TensorFlow实例: 手写汉字识别
数据挖掘入门与实战
11+阅读 · 2017年11月10日
在TensorFlow中对比两大生成模型:VAE与GAN
机器之心
12+阅读 · 2017年10月23日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
Top
微信扫码咨询专知VIP会员