本篇文章2488字,读完约6分钟

雷锋。(公开号码:雷锋。艾科技评论出版社:何致远,这篇文章的作者,原文是在智湖专栏《艾洞察》,和雷锋。《科技评论》被授权出版。

今天,我们将介绍一个小项目:在张量流中生成分形图案。分形本身只是一个数学概念,与机器学习没有什么关系。然而,通过分形的产生,我们可以知道如何在张量流中进行数学计算,如何进行基本的过程控制,这对学习张量流是一个很好的实践项目。

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

在我们开始之前,应该注意到张量流正式提供了一个生成分形图案的教程。然而,官方教程中生成的图像太难看了,只能生成一种模式。我对官方代码做了一些改进,并添加了各种类型的分形。此外,不仅可以生成图像,还可以制作Gif动画。代码已放在github:github/hzy 46/tensorflow-fractal-游乐场上。主程序只有50行。请参考它。

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

mandelbrot集Mandelbrot集是分形的最经典的例子。考虑迭代公式(z和c是复数)。当它为0时,获得的值可以形成一个系列,如下所示。当级数发散到无穷大时,相应的点属于曼德勃罗集。

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

如果是这样的话,很明显序列总是0并且不发散,所以0不属于mandelbrot集。

在另一个例子中,相应的顺序是数字越来越大,所以3i属于mandelbrot集合。

在二维平面上,所有不属于mandelbrot集的点都被标记为黑色,所有属于mandelbrot集的点根据其发散速度被赋予不同的颜色,从而可以得到mandelbrot的经典图像:

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

上图完全是用张量流计算的。类似的图片在网上应该看得更清楚。在张量流中,我们定义了以下计算步骤:

xs = TF . constant(z . as type(npplex 64))

zs = tf.variable(xs)

ns = TF . variable(TF . zeros _ like(xs,tf.float32))与tf.session():

TF . global _ variables _ initializer()。运行()

zs_ = tf .其中(TF . ABS(zs)not _ pided = TF . ABS(zs _)step = TF . group(

zs.assign(zs_),

ns . assign _ add(TF . cast(not _ pided,tf.float32))

对于范围内的I(ITER _ num):step . run()

final_step = ns.eval()

最终z = zs。eval()

在我们之前的迭代公式中,Zs对应于Z,而在迭代公式中,xs对应于C。为了方便起见,只要数值的绝对值大于预先指定的值,就认为是发散的。每个计算都使用tf.where来仅计算没有偏离的值。结合ns和zs,我们可以计算颜色,得到经典的曼德勃罗图像。

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

julia集Julia集与mandelbrot集相似,但这次我们修正了C,而是计算了发散的Z值。也就是说,c是一个固定的常数(可选的),级数变成。如果级数发散,相应的Z属于朱莉娅集。为此,我们可以通过修改原始程序中的两行来生成julia集:

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

xs = TF . constant(NP . full(shape = z . shape,fill_value=c,dtype=z.dtype))

zs = tf.variable(z)

我们在julia集中指定c值为fill_value=c,所以只要使用不同的c值,就可以生成完全不同的julia集!

默认::

将c值更改为并调整颜色(有关调整方法,请参考github页面上的描述):

选择,模式变得完全不同:

生成朱莉娅集的动画在朱莉娅集里,每次C的值稍有变化,生成的图片依次被制成gif,就可以生成如下所示的动画,相应的代码是朱莉娅_gif.py:

这里,由于上传gif的大小限制,只显示小尺寸的动画图像。该程序提供了一个宽度参数,可以修改该参数以生成更大尺寸和更高质量的动画图像。

探索曼德勃罗收藏(注意:下面的图片可能对重度恐惧症患者不友好。。。因此,请仔细翻页。。(

在上面生成的mandelbrot集合中,我们可以放大图像并选择一些区域来生成它,然后我们可以得到各种格式和不同形状的分形图案。相应的程序是曼德勃罗区

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

在mandelbrot集合中,有许多奇怪的模式,例如下图中的9个位置。

编号为2的地方被称为“大象谷”,因为这里的图案与大象非常相似,这个区域的图像可以通过直接运行mandelbrot_area.py获得:

编号为3的位置称为“三螺旋谷”,坐标位置在曼德勃罗区域修改。

start_x = -0.090 # x范围

end_x = -0.086

start_y = 0.654 # y范围

end_y = 0.657

宽度= 1000

比率1,比率2,比率3 = 0.2,0.6,0.6

你可以在这里得到模式:

编号为1的最后一个地方叫做“海马谷”,相应的坐标是:

start_x = -0.750# x范围

end_x = -0.747

start_y = 0.099 # y范围

end_y = 0.102

宽度= 1000

比率1,比率2,比率3 = 0.1,0.1,0.3

图像如下,这确实有点类似于海马体:

生成更多模式项提供了两个jupyter笔记本:mandelbrot。ipynb和julia.ipynb,可以更方便地探索Mandelbrot集和julia集。其中,曼德尔布罗集的更多坐标位置可以参考曼德尔布罗集快速指南(Nahee/Derbyshire/Manguide),而更有趣的朱莉娅集的C值可以参考朱莉娅集-维基百科(Julia Set-Wikipedia)。互联网上有许多类似的资源。

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

最后,看看安利的项目地址:github/hzy 46/tensorflow-fractal-游乐场。如果代码有任何问题,您可以直接在评论中发布,或者在github上提出问题:)

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

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

地址:http://www.hcsbodzyz.com/hcxw/10609.html