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

在开始之前,需要说明的是,TensorFlow官方也提供了一个生成分形图案的教程(地址:www.tensorflow.org/tutorials/mandelbrot),然而官方教程中生成的图像实在是太丑了,而且只能生成一种图案,我对官方的代码做了一些改进,并且加入了多种类型的分形,此外,不仅可以生成图像,还可以制作gif动画,代码已经放到了Github上: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-6477j…. ,数字越来越庞大,因此3i就属于Mandelbrot集合。

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

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

  1. xs = tf.constant(Z.astype(np.complex64))
  2. zs = tf.Variable(xs)
  3. ns = tf.Variable(tf.zeros_like(xs, tf.float32)) with tf.Session():
  4. tf.global_variables_initializer().run()
  5. zs_ = tf.where(tf.abs(zs) < R, zs**2 + xs, zs)
  6. not_diverged = tf.abs(zs_) < R
  7. step = tf.group(
  8. zs.assign(zs_),
  9. ns.assign_add(tf.cast(not_diverged, tf.float32))
  10. for i in range(ITER_NUM): step.run()
  11. final_step = ns.eval()
  12. 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集合:

  1. xs = tf.constant(np.full(shape=Z.shape, fill_value=c, dtype=Z.dtype))
  2. zs = tf.Variable(Z)

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

默认:c = -0.835 – 0.2321i :

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

选用c=0.285 + 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调整的是颜色):

  1. start_x = -0.090  # x range
  2. end_x = -0.086
  3. start_y = 0.654  # y range
  4. end_y = 0.657
  5. width = 1000
  6. ratio1, ratio2, ratio3 = 0.2, 0.6, 0.6

就可以得到该处的图案:

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

  1. start_x = -0.750  # x range
  2. end_x = -0.747
  3. start_y = 0.099  # y range
  4. end_y = 0.102
  5. width = 1000
  6. ratio1, ratio2, ratio3 = 0.1, 0.1, 0.3

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

生成更多的图案

项目提供了两个jupyter notebook:Mandelbrot.ipynb和Julia.ipynb可以对Mandelbrot集合、Julia集合做更方便的探索。其中,Mandelbrot集的更多坐标位置可以参考Quick Guide to the Mandelbrot Set,Julia集中更多有趣的c值可以参考Julia set – Wikipedia。网上类似的资源还有很多。

本文作者:何之源

来源:51CTO

如何用TensorFlow生成令人惊艳的分形图案相关推荐

  1. python生成分形图片_如何用TensorFlow生成令人惊艳的分形图案

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

  2. 【AI训练新手记:如何通过ChatGPT生成令人惊艳的文案!】

    [我]:我是一名Youtuber,工作内容是写吸引人的youtube脚本,并拍摄上传,我的领域是技术型频道,请你告诉我10个chatgpt相关的吸引人的选题 [ChatGPT]:当然,下面是10个有关 ...

  3. iPad 上有哪些实用得令人惊艳的 App?

    http://www.zhihu.com/question/22678622 宋玖,俗世一粒微尘! 陈广兴.OPEN曹.吕归尘 等人赞同 ipad上没有自带的计算机吧 这个就是个计算器,而且它厉害在于 ...

  4. bash 判断 os 版本_专家:鸿蒙OS初登手机令人惊艳,但全面商用至少还要2年

    鸿蒙 OS 迈入成熟,第一部正式搭载的手机是华为 P50? 华为手机销量持续下滑,鸿蒙现在登陆手机是个坏消息吗? 专家:鸿蒙 OS 初登手机令人惊艳,但全面商用至少还要 2 年 即使鸿蒙(Harmon ...

  5. 网友鸿蒙谷歌的Android,华为鸿蒙OS已经确认更名?新名字更加令人惊艳!网友:过目难忘...

    原标题:华为鸿蒙OS已经确认更名?新名字更加令人惊艳!网友:过目难忘 众所周知,在移动端的主流系统,目前就只有Android和iOS两大系统,但是无一例外的Android和iOS都是美国企业的产品,但 ...

  6. 盘点那些令人惊艳的黑科技

    随着中国互联网的快速发展,不少新兴产业电子商务也进入了大家的视野,AI智能人.无人驾驶,物联网.空间智能等行业的快速发展,展示了我国科技经济发展的一个新的实力.你知道有哪些令人惊艳的黑科技呢?今天我们 ...

  7. HTML5+CSS3+JQuery小实例:简单又令人惊艳的hover效果登录界面

    今天给大家带来一个小案例,HTML5+CSS3+JQuery实现简单又令人惊艳的hover效果登录界面. 先看效果: 源代码: <div class="container"& ...

  8. python中令人惊艳的小众数据科学库

    Python是门很神奇的语言,历经时间和实践检验,受到开发者和数据科学家一致好评,目前已经是全世界发展最好的编程语言之一.简单易用,完整而庞大的第三方库生态圈,使得Python成为编程小白和高级工程师 ...

  9. 浙江大学发布四足机器人“绝影”,爬坡踏雪稳定性令人惊艳

    在视频中,"绝影"展现了反应快.姿态稳和定位准的特性. 日前,浙江大学熊蓉教授领导的机器人团队发布了一段四足机器人的视频.视频的主角是一个名为"绝影"的四足机器 ...

最新文章

  1. java mysql 查询结果_JAVA中显示MYSQL查询结果
  2. 前端跨域请求get_前端实现跨域访问
  3. 一个封装了的选项卡效果js
  4. 【51单片机快速入门指南】5:软件SPI
  5. [jQuery] 针对jQuery的优化方法有哪些?
  6. python程序框架的描述_简单介绍Python下自己编写web框架的一些要点
  7. python支持多种编程范式吗_Python3学习之路~6.1 编程范式:面向过程 VS 面向对象...
  8. 腾讯云TCP架构高级工程师认证考试大纲、考题下载及说明
  9. 瑞盟MS2358 96KHz、24bit音频ADC芯片--DFN12 封装
  10. 开源电子商城系统:罗列几个电子商城系统,和一个不错的开源电子商城项目:mall,先做技术调研,主要还是学习代码。
  11. docker swarm和docker service
  12. IE8开发人员工具使用详解下(模式,JS调试,探查器)
  13. 详解IP地址与子网掩码
  14. In Search of an Understandable Consensus Algorithm(Extended Version)
  15. Python中__dict__属性的详解(思维导图版)
  16. php空间xpyun_php云人才系统官方版-phpyun下载 v4.0 官方正式版 - 安下载
  17. [NAS] QNAP/威联通 常用设置和操作
  18. Word表格操作简历排版
  19. 天津户口高考是否能加分?
  20. GTA4下载和玩教程

热门文章

  1. lisp语言cond和if套用_AutoCAD LISP 循环选择语句cond
  2. 5gh掌上云计算认证不通过_华为认证HCIE云计算难吗?
  3. centos mysql-dev_CentOS7 安装 mysql
  4. docker build -t_利用Dockerfile自定义镜像-图解轻松学Dockeramp;K8S
  5. python主循环方法mainloop_Python:Tkinter:为什么是root.mainloop()而不是app.mainloop()...
  6. 关于基因差异化的那些事 edger Deseq2和limma的使用及一些总结
  7. zynqpl端时钟_已解决: Zynq7020 PL侧时钟是50M,实测是49.5M - Community Forums
  8. php query builder,php – Symfony2 – Doctrine2 QueryBuilder WHERE I...
  9. 人脸检测(五)--adaboost总结,整理
  10. 24速算c语言实训报告ppt,C语言课程设计(速算24).doc