丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給汪思穎
發(fā)送

1

如何用TensorFlow生成令人驚艷的分形圖案

本文作者: 汪思穎 2017-09-08 18:23
導(dǎo)語:用于學(xué)習(xí)TensorFlow的練手小項目

雷鋒網(wǎng) AI科技評論按:本文作者何之源,原文載于知乎專欄AI Insight,雷鋒網(wǎng) AI科技評論獲其授權(quán)發(fā)布。

今天來介紹一個小項目:在TensorFlow中生成分形圖案。分形本身只是一個數(shù)學(xué)概念,與機器學(xué)習(xí)并無太大關(guān)系,但是通過分形的生成,我們可以了解怎么在TensorFlow中進行數(shù)學(xué)計算,以及如何進行基本的流程控制,是學(xué)習(xí)TensorFlow的一個非常好的練手項目。

在開始之前,需要說明的是,TensorFlow官方也提供了一個生成分形圖案的教程(地址: www.tensorflow.org/tutorials/mandelbrot),然而官方教程中生成的圖像實在是太丑了,而且只能生成一種圖案,我對官方的代碼做了一些改進,并且加入了多種類型的分形,此外,不僅可以生成圖像,還可以制作gif動畫,代碼已經(jīng)放到了Github上:https://github.com/hzy46/tensorflow-fractal-playground,主要的程序只有50行,歡迎大家參考。

Mandelbrot集合

Mandelbrot集合是分形中最經(jīng)典的一個例子??紤]迭代公式 如何用TensorFlow生成令人驚艷的分形圖案 (z和c都是復(fù)數(shù))。當(dāng) 如何用TensorFlow生成令人驚艷的分形圖案 為0時,得到的值可以組成一個數(shù)列,依次為 如何用TensorFlow生成令人驚艷的分形圖案 。當(dāng)該數(shù)列發(fā)散到無窮時,對應(yīng)的點就屬于Mandelbrot集合。

如何用TensorFlow生成令人驚艷的分形圖案 時,顯然數(shù)列永遠是0,并不發(fā)散,因此0不屬于Mandelbrot集合。

又如 如何用TensorFlow生成令人驚艷的分形圖案 時,對應(yīng)的數(shù)列為 如何用TensorFlow生成令人驚艷的分形圖案 ,數(shù)字越來越龐大,因此3i就屬于Mandelbrot集合。

在二維平面上,將所有不屬于Mandelbrot集合的點標(biāo)記為黑色,將所有屬于Mandelbrot集合的點按照其發(fā)散速度賦予不同的顏色,就可以得到Mandelbrot的經(jīng)典圖像:

如何用TensorFlow生成令人驚艷的分形圖案

上面這張圖完全是使用TensorFlow進行計算的,類似的圖大家應(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ā)散的值進行計算。結(jié)合ns和zs_就可以計算顏色,得到經(jīng)典的Mandelbrot圖像。

Julia集合

Julia集合和Mandelbrot集合差不多,但這次我們固定c,轉(zhuǎn)而計算發(fā)散的z的值。即c是固定的常數(shù)(可以任?。?,數(shù)列變成 如何用TensorFlow生成令人驚艷的分形圖案 。如果該數(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): 如何用TensorFlow生成令人驚艷的分形圖案

如何用TensorFlow生成令人驚艷的分形圖案

將c值變?yōu)?如何用TensorFlow生成令人驚艷的分形圖案 ,并調(diào)整顏色(調(diào)整方法參考Github頁面的說明):

如何用TensorFlow生成令人驚艷的分形圖案

選用 如何用TensorFlow生成令人驚艷的分形圖案 ,圖案又變得完全不同:

如何用TensorFlow生成令人驚艷的分形圖案

生成Julia集合的動畫

在Julia集合中,每次都對c的值進行微小的改變,并將依次生成圖片制作為gif,就可以生成如下所示的動畫,對應(yīng)的代碼為julia_gif.py:

如何用TensorFlow生成令人驚艷的分形圖案

這里由于上傳gif有大小限制的關(guān)系,只展示了一個小尺寸的動畫圖像。程序中提供了一個width參數(shù),可以修改它以生成更大尺寸,質(zhì)量更高的動畫圖像。

探索Mandelbrot集合

(注意:下面的圖片可能對密集恐懼癥患者不太友好。。。因此慎重翻頁。。)

在前面生成的Mandelbrot集合中,我們可以將圖像放大,選取某些區(qū)域進行生成,就可以得到格式各樣造型迥異的分形圖案,對應(yīng)的程序為mandelbrot_area.py。

在Mandelbrot集合中,有很多地方圖案比較奇特,如下圖中的9個位置。

如何用TensorFlow生成令人驚艷的分形圖案

其中編號為2的地方被稱為“Elephant Valley”,因為此處的圖案與大象很像,直接運行mandelbrot_area.py就可以得到該區(qū)域的圖像:

如何用TensorFlow生成令人驚艷的分形圖案

編號為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

就可以得到該處的圖案:

如何用TensorFlow生成令人驚艷的分形圖案

最后編號為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

圖像如下,確實和海馬有一點神似:

如何用TensorFlow生成令人驚艷的分形圖案

生成更多的圖案

項目提供了兩個jupyter notebook:Mandelbrot.ipynb和Julia.ipynb可以對Mandelbrot集合、Julia集合做更方便的探索。其中,Mandelbrot集的更多坐標(biāo)位置可以參考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)。網(wǎng)上類似的資源還有很多。

最后再安利一下項目地址:https://github.com/hzy46/tensorflow-fractal-playground。如果代碼有什么問題可以直接發(fā)在評論里或者在Github上提出issue:)

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知

如何用TensorFlow生成令人驚艷的分形圖案

分享:
相關(guān)文章

編輯

關(guān)注AI學(xué)術(shù),例如論文
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說