您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何用TensorFlow生成令人驚艷的分形圖案,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
今天來介紹一個小項目:在TensorFlow中生成分形圖案。分形本身只是一個數(shù)學(xué)概念,與機(jī)器學(xué)習(xí)并無太大關(guān)系,但是通過分形的生成,我們可以了解怎么在TensorFlow中進(jìn)行數(shù)學(xué)計算,以及如何進(jìn)行基本的流程控制,是學(xué)習(xí)TensorFlow的一個非常好的練手項目。
在開始之前,需要說明的是,TensorFlow官方也提供了一個生成分形圖案的教程(地址: www.tensorflow.org/tutorials/mandelbrot),然而官方教程中生成的圖像實在是太丑了,而且只能生成一種圖案,我對官方的代碼做了一些改進(jìn),并且加入了多種類型的分形,此外,不僅可以生成圖像,還可以制作gif動畫。
Mandelbrot集合
Mandelbrot集合是分形中最經(jīng)典的一個例子??紤]迭代公式z_{n+1}=z_{n}^2 + c(z和c都是復(fù)數(shù))。當(dāng)z_0為0時,得到的值可以組成一個數(shù)列,依次為c, c^2+c,(c^2+c)^2+c……。當(dāng)該數(shù)列發(fā)散到無窮時,對應(yīng)的點(diǎn)就屬于Mandelbrot集合。
如c=0 時,顯然數(shù)列永遠(yuǎn)是0,并不發(fā)散,因此0不屬于Mandelbrot集合。
又如c=3i 時,對應(yīng)的數(shù)列為3i, -9+3i, 63-51i, 1431-6477j…. ,數(shù)字越來越龐大,因此3i就屬于Mandelbrot集合。
在二維平面上,將所有不屬于Mandelbrot集合的點(diǎn)標(biāo)記為黑色,將所有屬于Mandelbrot集合的點(diǎn)按照其發(fā)散速度賦予不同的顏色,就可以得到Mandelbrot的經(jīng)典圖像:
上面這張圖完全是使用TensorFlow進(jìn)行計算的,類似的圖大家應(yīng)該在網(wǎng)上也見過好多了,在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就對應(yīng)我們之前迭代公式的z,而xs就對應(yīng)迭代公式中的c。為了方便起見,只要計算時數(shù)值的絕對值大于一個事先指定的值R,就認(rèn)為其發(fā)散。每次計算使用tf.where只對還未發(fā)散的值進(jìn)行計算。結(jié)合ns和zs_就可以計算顏色,得到經(jīng)典的Mandelbrot圖像。
Julia集合
Julia集合和Mandelbrot集合差不多,但這次我們固定c,轉(zhuǎn)而計算發(fā)散的z的值。即c是固定的常數(shù)(可以任取),數(shù)列變成z,z^2+c,(z^2+c)^2 +c,…..。如果該數(shù)列發(fā)散,對應(yīng)的z就屬于Julia集合。對此,我們只要在原來的程序中修改兩行內(nèi)容,就可以生成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集合!
默認(rèn):c = -0.835 – 0.2321i :
將c值變?yōu)閏 = -0.8 * 1j ,并調(diào)整顏色(調(diào)整方法參考Github頁面的說明):
選用c=0.285 + 0.01i ,圖案又變得完全不同:
生成Julia集合的動畫
在Julia集合中,每次都對c的值進(jìn)行微小的改變,并將依次生成圖片制作為gif,就可以生成如下所示的動畫,對應(yīng)的代碼為julia_gif.py:
這里由于上傳gif有大小限制的關(guān)系,只展示了一個小尺寸的動畫圖像。程序中提供了一個width參數(shù),可以修改它以生成更大尺寸,質(zhì)量更高的動畫圖像。
探索Mandelbrot集合
(注意:下面的圖片可能對密集恐懼癥患者不太友好。。。因此慎重翻頁。。)
在前面生成的Mandelbrot集合中,我們可以將圖像放大,選取某些區(qū)域進(jìn)行生成,就可以得到格式各樣造型迥異的分形圖案,對應(yīng)的程序為mandelbrot_area.py。
在Mandelbrot集合中,有很多地方圖案比較奇特,如下圖中的9個位置。
其中編號為2的地方被稱為“Elephant Valley”,因為此處的圖案與大象很像,直接運(yùn)行mandelbrot_area.py就可以得到該區(qū)域的圖像:
編號為3的地方被稱為“Triple Spiral Valley”(三重螺旋),在mandelbrot_area.py修改一下坐標(biāo)位置為(ratio調(diào)整的是顏色):
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”(海馬山谷),對應(yīng)的坐標(biāo)為:
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
圖像如下,確實和海馬有一點(diǎn)神似:
生成更多的圖案
項目提供了兩個jupyter notebook:Mandelbrot.ipynb和Julia.ipynb可以對Mandelbrot集合、Julia集合做更方便的探索。
關(guān)于如何用TensorFlow生成令人驚艷的分形圖案就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。