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

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

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

Mandelbrot集合

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

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

又如 c=3i时,对应的数列为 3i,-9+3i,63-51i,1431-6477i......,数字越来越庞大,因此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,z^2+c,(z^2+c)^2+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=-0.835-0.2321i:

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

选用 c=0285+0.01i,图案又变得完全不同:

生成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科技评论(aitechtalk)

原文发表时间:2017-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AlgorithmDog的专栏

遗传算法系列之二:“欺骗”深度学习的遗传算法

这篇博客主要介绍不同问题的遗传算法。 遗传算法是通用的全局优化算法,因此有很多的应用。有很多应用我是看不懂的,比如机器人步态优化。机器人...

2659
来自专栏小樱的经验随笔

遗传算法详解(LINGO及MatlabGA工具箱求解实现)

遗传算法 1.前言 遗传算法是一种基于生物界自然群体遗传进化机制的自适应全局优化概率搜索算法。它与传统算法不同,不依赖梯度信息,而是通过模拟自然进化过程来搜索最...

5386
来自专栏数据魔术师

干货 | 嘿!你和遗传算法的距离也许只差这一文(附C++代码和详细代码注释)

这是数据魔术师的第5篇算法干货文 ▲ 一 什么是遗传算法? 遗传算法(Genetic Algorithm,简称GA)起源于对生物系统所进行的计算机模拟研究...

3436
来自专栏企鹅号快讯

opencv是Python处理图片的利器!Python大牛教你玩转opencv!

opencv作为我最常用的图像处理库,当然第一个介绍,并且介绍得比较全面。毋庸置疑,opencv是今天介绍得所有图像库中最全面也最强大的库,如果我们只想掌握一个...

2855
来自专栏申龙斌的程序人生

零基础学编程041:欧拉公式的几何意义

欧拉公式号称是最美的出自上帝之手的数学公式,即 ? ,这个公式里 e 和 π 都是无理数,i 是 -1 的平方根,是一个虚数,0和1是最简单的整数,欧拉公式把...

3739
来自专栏大数据文摘

5万余首圣诞歌词数据包+Kaggle数据科学家的脑洞=?(附数据包+代码)

1253
来自专栏Tencentcloud

交互式数字作品教程——专为艺术家的你!

这篇文章不是对循环神经网络的综合概述。它适用于没有任何机器学习背景的读者。其目的是向艺术家和设计师展示如何使用预先训练的神经网络——使用简单的Javascrip...

2076
来自专栏大数据挖掘DT机器学习

python机器学习入门资料梳理

在python基本语法入门之后,就要准备选一个研究方向了。马上就要进行春季实习招聘了,加油!总结一下python机器学习方面的资料吧。 1、数据处理 1....

2655
来自专栏人工智能LeadAI

TensorFlow应用实战-17-Qlearning实现迷宫小游戏

总共有12个状态,s1到s12.对于每一个状态会有四个动作。对于每个状态下的每个动作会有一个Q的值。

1151
来自专栏机器学习之旅

python开发:特征工程代码模版(二)

正题开始: 这篇文章是入门级的特征处理的打包解决方案的python实现汇总,如果想get一些新鲜血液的朋友可以叉了,只是方便玩数据的人进行数据特征筛选的代码集...

803

扫描关注云+社区