多语言展示
当前在线:238今日阅读:84今日分享:32

用python-tensorflow绘制Mandelbrot分形

本文,参考了极客学院的tensorflow教程,模仿制作Mandelbrot分形的方法。原教程有个别陷阱,是源于tensorflow的更新换代,导致个别功能缺失或迁移,进而导致代码不能执行。本文,修补了相关BUG,成功导出分形图。
工具/原料
1

电脑

2

python3.6(anaconda)

3

tensorflow模块

4

可视化模块Pillow、IPython

5

数据处理模块numpy

修补BUG
1

原教程给出的代码如下图所示。

2

这个代码运行报错:No module named 'cStringIO'

3

原因是,在新版的tensorflow里面,取消了cStringIO,需要用io代替。from io import BytesIO

4

再运行,还是报错:module 'tensorflow' has no attribute 'complex_abs'

5

原因是,新版的tensorflow用abs函数取缔了complex_abs。

6

此时运行,就可以成功出图。

解析代码
1

先创建一个复数数组:import numpy as npY, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]Z = X+1j*Y这个数组是一个520*600大小的复数矩阵,里面的数据类型是complex128。

2

把Z转化为tensorflow可识别的complex64数据类型:import tensorflow as tfxs = tf.constant(Z.astype('complex64'))

3

把xs转化为tensorflow变量:zs = tf.Variable(xs)

4

构造一个与zs形状完全相同的变量,且里面的元素全部是0:ns = tf.Variable(tf.zeros_like(xs, 'float32'))

5

建立一个与tensorflow的对话:sess = tf.InteractiveSession()初始化所有的变量:tf.initialize_all_variables().run()执行变换操作:zs_ = zs*zs + xs      #(z=z^2+x)只保留模长小于4的复数:not_diverged = tf.abs(zs_) < 4创建迭代:step = tf.group(zs.assign(zs_),                ns.assign_add(tf.cast(not_diverged, 'float32')))

6

第一次迭代,输出的信息是:name: 'group_deps'op: 'NoOp'input: '^Assign'input: '^AssignAdd'

7

再运行一次,就是第2次迭代。name: 'group_deps_1'op: 'NoOp'input: '^Assign_1'input: '^AssignAdd_1'

8

创建一个画图函数:def DisplayFractal(a, fmt='jpeg'):  a_cyclic = (6.28*a/20.0).reshape(list(a.shape)+[1])  img = np.concatenate([10+20*np.cos(a_cyclic),                        30+50*np.sin(a_cyclic),                        155-80*np.cos(a_cyclic)], 2)  img[a==a.max()] = 0  a = img  a = np.uint8(np.clip(a, 0, 255))  f = BytesIO()  PIL.Image.fromarray(a).save(f, fmt)  display(Image(data=f.getvalue()))画出初始状态下的ns对应的图像:DisplayFractal(ns.eval())

9

迭代5次,绘制图形:for i in range(5):    step.run()DisplayFractal(ns.eval())

10

迭代10次的图形。

11

迭代50次的图形。

12

迭代1000次的图形。

其它分形图案
1

下面全是迭代1000次的图形。规则是zs_ = zs**3 + xs的图形。

2

规则:zs_ = zs**4 + xs

3

规则:zs_ = zs**6 + xs

4

规则:zs_ = zs**36 + xs

5

规则:zs_ = tf.sin(zs) + xs

6

zs_ = tf.sin(zs**2) + xs

7

zs_ = tf.sin(zs**3) + xs

8

zs_ = tf.sin(zs**6) + xs

9

zs_ = tf.sin(zs**36) + xs

10

zs_ = tf.cos(zs) + xs

11

zs_ = tf.cos(zs**2) + xs

12

zs_ = tf.cos(zs**3) + xs

推荐信息