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

2021-01-07 雷鋒網

雷鋒網(公眾號:雷鋒網) AI科技評論按:本文作者何之源,原文載於知乎專欄AI Insight,雷鋒網 AI科技評論獲其授權發布。

今天來介紹一個小項目:在TensorFlow中生成分形圖案。分形本身只是一個數學概念,與機器學習並無太大關係,但是通過分形的生成,我們可以了解怎麼在TensorFlow中進行數學計算,以及如何進行基本的流程控制,是學習TensorFlow的一個非常好的練手項目。

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

Mandelbrot集合

Mandelbrot集合是分形中最經典的一個例子。考慮迭代公式 (z和c都是複數)。當 為0時,得到的值可以組成一個數列,依次為 。當該數列發散到無窮時,對應的點就屬於Mandelbrot集合。

時,顯然數列永遠是0,並不發散,因此0不屬於Mandelbrot集合。

又如 時,對應的數列為 ,數字越來越龐大,因此3i就屬於Mandelbrot集合。

在二維平面上,將所有不屬於Mandelbrot集合的點標記為黑色,將所有屬於Mandelbrot集合的點按照其發散速度賦予不同的顏色,就可以得到Mandelbrot的經典圖像:

<img src="https://static.leiphone.com/uploads/new/article/pic/201709/fdc6823436bde5a6ea991c1931747893.png" data-rawwidth="1000" data-rawheight="686" class="origin_image zh-lightbox-thumb" width="1000" data-original="https://pic1.zhimg.com/v2-ffca32a868fc484837cd7bd17de6102c_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201709/fdc6823436bde5a6ea991c1931747893.png"/>

上面這張圖完全是使用TensorFlow進行計算的,類似的圖大家應該在網上也見過好多了,在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就對應我們之前迭代公式的z,而xs就對應迭代公式中的c。為了方便起見,只要計算時數值的絕對值大於一個事先指定的值R,就認為其發散。每次計算使用tf.where只對還未發散的值進行計算。結合ns和zs_就可以計算顏色,得到經典的Mandelbrot圖像。

Julia集合

Julia集合和Mandelbrot集合差不多,但這次我們固定c,轉而計算發散的z的值。即c是固定的常數(可以任取),數列變成 。如果該數列發散,對應的z就屬於Julia集合。對此,我們只要在原來的程序中修改兩行內容,就可以生成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集合!

默認:

&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/189e1749a0f7b44bd35b64923c1bc6c8.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;1200&amp;amp;quot; data-rawheight=&amp;amp;quot;695&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;1200&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-fa34eacb1ad6c4eebb7c3d59398c5e72_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/189e1749a0f7b44bd35b64923c1bc6c8.png&amp;amp;quot;/&amp;amp;gt;

將c值變為 ,並調整顏色(調整方法參考Github頁面的說明):

&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/9f9146f45067fa89aa38bf6496273a70.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;1200&amp;amp;quot; data-rawheight=&amp;amp;quot;1040&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;1200&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-1c88aff1df12798b6a2b552079b7098e_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/9f9146f45067fa89aa38bf6496273a70.png&amp;amp;quot;/&amp;amp;gt;

選用 ,圖案又變得完全不同:

&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/3542c2f2c23a08d0b3b7452c51bc0d99.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;1200&amp;amp;quot; data-rawheight=&amp;amp;quot;1040&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;1200&amp;amp;quot; data-original=&amp;amp;quot;https://pic1.zhimg.com/v2-3647ec260c639c35e37972dfad30fbd8_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/3542c2f2c23a08d0b3b7452c51bc0d99.png&amp;amp;quot;/&amp;amp;gt;

生成Julia集合的動畫

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

這裡由於上傳gif有大小限制的關係,只展示了一個小尺寸的動畫圖像。程序中提供了一個width參數,可以修改它以生成更大尺寸,質量更高的動畫圖像。

探索Mandelbrot集合

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

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

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

&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/765b4cce7bfca4098c1caba17cb10d7c.gif&amp;amp;quot; data-rawwidth=&amp;amp;quot;200&amp;amp;quot; data-rawheight=&amp;amp;quot;150&amp;amp;quot; data-thumbnail=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/91ad333ebfbbd704323e532e3c0a543a.jpg&amp;amp;quot; class=&amp;amp;quot;content_image&amp;amp;quot; width=&amp;amp;quot;200&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/765b4cce7bfca4098c1caba17cb10d7c.gif&amp;amp;quot;/&amp;amp;gt;

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

&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/d396fe230bbb0b28b8476219e51ca90c.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;1000&amp;amp;quot; data-rawheight=&amp;amp;quot;800&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;1000&amp;amp;quot; data-original=&amp;amp;quot;https://pic4.zhimg.com/v2-936fa16a9362e7f350e15a2c695e2713_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/d396fe230bbb0b28b8476219e51ca90c.png&amp;amp;quot;/&amp;amp;gt;

編號為3的地方被稱為「Triple Spiral Valley」(三重螺旋),在mandelbrot_area.py修改一下坐標位置為(ratio調整的是顏色):

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

就可以得到該處的圖案:

&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/2633f166ac043e12dd0b9c1e3f2c312d.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;1001&amp;amp;quot; data-rawheight=&amp;amp;quot;751&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;1001&amp;amp;quot; data-original=&amp;amp;quot;https://pic2.zhimg.com/v2-e3303f438522410d5db4c97b0b6ebfa9_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/2633f166ac043e12dd0b9c1e3f2c312d.png&amp;amp;quot;/&amp;amp;gt;

最後編號為1的地方被稱為「Seahorse Valley」(海馬山谷),對應的坐標為:

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

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

&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/084cc607c6e95f73777564bd4b0021ba.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;1000&amp;amp;quot; data-rawheight=&amp;amp;quot;1000&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;1000&amp;amp;quot; data-original=&amp;amp;quot;https://pic1.zhimg.com/v2-ddec205c425dac242aba103c5e2e4bc0_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201709/084cc607c6e95f73777564bd4b0021ba.png&amp;amp;quot;/&amp;amp;gt;

生成更多的圖案

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

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

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    深度學習,尤其是對抗生成網絡 GAN,已經被成功應用在超分任務上,比如 SRGAN 和 ESRGAN 都可以生成比較真實的超分圖片。那麼在本文裡,我們將介紹一下如何使用TensorFlow Hub上的一個預訓練的 ESRGAN 模型來在一個安卓 app 中生成超分圖片。最終的 app 效果如下圖,我們也已經將完整代碼開源給大家參考。
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    HTTP/REST API at:localhost:8501 …$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
  • Tensorflow基礎教程15天之創建Tensor
    Tensor是Tensorflow中使用在計算圖中的最基本的數據單位,我們可以聲明Tensor為variable,或者為Tensor提供placeholer。但首先我們必須知道如何創建Tensor。在將Tensor定義為Variable之後,Tensorflow才會將其傳入計算圖。如何操作我們將在這裡介紹創建Tensor的主要方法。
  • TensorFlow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    邊緣計算(Edge computing)是一種在物理上靠近數據生成的位置從而對數據進行處理和分析的方法,為解決這些問題提供了方案。以「Ok Google」這個功能為例:用一名用戶的聲音來訓練「Ok Google」,他的手機在接收到這個關鍵詞的時候就會被喚醒。
  • TensorFlow官方力推、GitHub爆款項目:用Attention模型自動生成...
    原標題:TensorFlow官方力推、GitHub爆款項目:用Attention模型自動生成圖像字幕 來源:GitHub 編譯:金磊 【新智元導讀】近期,TensorFlow官方推文推薦了一款十分有趣的項目——用Attention模型生成圖像字幕。
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • 如何優雅地用TensorFlow預測時間序列:TFTS庫詳細教程
    前言如何用TensorFlow結合LSTM來做時間序列預測其實是一個很老的話題,然而卻一直沒有得到比較好的解決。如果在Github上搜索「tensorflow time series」,會發現star數最高的tgjeon/TensorFlow-Tutorials-for-Time-Series已經和TF 1.0版本不兼容了,並且其他的項目使用的方法也各有不同,比較混亂。
  • 輸入示例,自動生成代碼:TensorFlow官方工具TF-Coder已開源
    項目地址:https://github.com/google-research/tensorflow-coderGoogle Colab 試用地址:https://colab.research.google.com/github/google-research/tensorflow-coder/blob/master/TF-Coder_Colab.ipynb
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    《TensorFlow學習筆記1:入門》連結:http://www.jeyzhang.com/tensorflow-learning-notes.html本文與上一篇的行文思路基本一致,首先概括了TensorFlow的特性,然後介紹了graph、session、variable 等基本概念的含義,以具體代碼的形式針對每個概念給出了進一步的解釋
  • TensorFlow 資源大全中文版
    TensorFlow時間序列上的分類 – 在TensorFlow上的基於手機傳感數據的LSTM循環神經網絡模型/工程圖片形態轉換 – 無監督圖片形態轉換的實現Show, Attend and Tell算法 -基於聚焦機制的自動圖像生成器Neural Style – Neural Style
  • 步履不停:TensorFlow 2.4新功能一覽!
    此教程介紹了如何設置 ParameterServerStrategy,並說明了如何使用 ClusterCoordinator 類來創建資源、調度函數和處理任務失敗。    參數伺服器訓練教程           https://tensorflow.google.cn/tutorials/distribute/parameter_server_training    ClusterCoordinator           https://tensorflow.google.cn/api_docs/python
  • 玩轉TensorFlow?你需要知道這30功能
    如果你關心如何使模型保持最新並監控它們,那麼你可以了解一下這個產品、看看它的論文。地址是:tensorflow.org/tfx/?TF Hub 的地址是:tensorflow.org/hub/ 3)TFX 數據驗證如何自動確保用於重新訓練模型的數據與最初用於訓練模型的數據具有相同的格式
  • 5個簡單的步驟掌握Tensorflow的Tensor
    在這篇文章中,我們將深入研究Tensorflow Tensor的細節。我們將在以下五個簡單步驟中介紹與Tensorflow的Tensor中相關的所有主題:第一步:張量的定義→什麼是張量?讓我們看看張量如何與代碼示例一起工作。但是首先,要使用TensorFlow對象,我們需要導入TensorFlow庫。我們經常將NumPy與TensorFlow一起使用,因此我們還可以使用以下行導入NumPy:import tensorflow as tfimport numpy as np張量的創建:創建張量對象有幾種方法可以創建tf.Tensor對象。
  • TFX 最新博文:如何使用 TensorFlow 生態系統實現快速高效的 BERT...
    那麼,各種 TensorFlow 庫和組件如何幫助研究人員達到這個裡程碑?作為 SAP Concur 實驗室的高級機器學習工程師,Hannes Hapke 寫了一篇博文分享了他們的做法。TFX 團隊的研究人員也參與了這篇博文的編輯。這篇博客文章將向你概述如何使用 TensorFlow 生態系統來實現可伸縮、快速、高效的 BERT 部署。全文編譯如下。
  • 基於RTX2060構建TensorFlow-gpu(keras)學習平臺
    安裝tensorflow:pip install tensorflow-gpu==1.143. 安裝keras:pip install keras,默認安裝的是最新的版本,2.3.0遇到以下 問題如:ERROR: Cannot uninstall 'wrapt'.
  • 最簡單的深度學習TensorFlow應用舉例!
    小編我的電腦很一般,沒有32G內存,也沒有1080,就windows上直接裝了23333windows+python 3.6+pycharm+tensorflow cpu話不多說,直接線性回歸,上圖。代碼截圖#接下來貼代碼#辰星樹洞import numpy as np #這是Python的一種開源的數值計算擴展,非常強大import tensorflow
  • 深度解讀TensorFlow,了解它的最新發展!
    Tensorboard是tensorflow內置的一個可視化工具,它通過將tensorflow程序輸出的日誌文件的信息可視化,使得tensorflow程序的理解、調試和優化更加簡單高效。Tensorboard的可視化依賴於tensorflow程序運行輸出的日誌文件,因而tensorboard和tensorflow程序在不同的進程中運行。
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    Keras模式import numpy as npimport tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2Dfrom tensorflow.keras import Modelfrom tensorflow.keras.optimizers
  • TensorFlow 中文資源全集,學習路徑推薦
    https://gitee.com/fendouai/Awesome-TensorFlow-Chinese很多內容下面這個英文項目:Inspired by https://github.com/jtoy/awesome-tensorflow官方網站官網:https://www.tensorflow.org/中文:https://tensorflow.google.cn