最近,有個項目在社交媒體上火起來了,項目作者是來自維也納的3D特效師。
建立這樣一個CNN可視化工具,是它在碩士論文完成,因為當初學的就是神經網絡,學的過程中很難明白卷積層之間是如何互相連接配接,又如何與不同類型的層連接配接的。
是以建立這個項目,主要能讓此工具的主要功能包括,卷積、最大池化和完全連接配接層的可視化表示,還有各種能實作更清晰可視化的簡化機制等等。
釋出這個自己學習成功成果,就是想讓初學者通過最直覺的方式,來get到CNN的重點,也讓人更多深刻的了解明白!
怎麼用Unity搞出一個3D網絡
在正式上手Unity前,作者先在Houdini軟體中,搭建了一個可視化的3D網絡原型。
也就是說,要給Unity版3D網絡提供一個搭建思路,提前準備好實作展示卷積計算的方法、特征圖的形狀、邊綁定的效果等問題。
提前,預設好神經網絡的“形狀”,由于之前并沒有用過Unity,作者先學習了着色器和過程式幾何相關的知識。
這裡面,作者發現了一些局限性,他采用的是Unity為着色器開發的語言Shaderlab。
這個語言無法使用着色變化,隻有對語義進行預定義的變量,才能讓它在頂點、幾何和像素着色器之間傳遞。
而且,它無法任意配置設定頂點屬性,隻有位置、顔色、UV等預定義屬性。(可能這也是3D網絡無法實時改變顔色的原因之一)
在研究了一些執行個體化(instancing)相關的概念後,作者計劃采用幾何着色器的方法生成神經網絡的連線。其中起點和終點被傳遞到頂點着色器,并直接轉發到幾何着色器。
這些線,最多可以由120個頂點組成,因為Unity允許的幾何着色器能建立的變量的标量浮點數為1024。
随後,從模型的TensorFlow代碼中,生成對應的3D神經網絡圖像。
其中,Tensorflow-native.ckpt格式的檔案,需要存儲重構模型圖所需的資料、二進制的權重讀取和激活值,以及特定層的名字。
在那之後,需要加載這些檢查點檔案、啟動TensorFlow會話,輸入訓練示例,可以很好的查詢每一層的激活函數。
随後編寫一個json檔案,存儲每一層的形狀、名稱、權重和激活函數,便于讀取。
最終展示的效果,看起來是讓人容易讀懂!
這個項目可不止這國外的小哥想到示範,就在去年時候,一位中國博士就可視化了卷積神經網絡,也是每一層的變化都展示得非常清楚,如下圖顯示那樣!
而且在GitHub上星标的5千2星星,熱度還行,這個項目,同樣用到了邊綁定、光線追蹤等技術,與特征提取、微調和歸一化相結合,将神經網絡可視化。
這項項目希望能借由這些技術,來估計神經網絡中不同部分的重要性。
如果你對這類3D神經網絡可視化感興趣,可以去小編給的GitHub上項目了解相關詳情哦!
開發過程:
https://vimeo.com/stefsietz
已開源的3D神經網絡項目:
https://github.com/julrog/nn_vis
中國版的神經網絡項目
https://github.com/poloclub/cnn-explainer
參考連結:
https://www.reddit.com/r/MachineLearning/comments/leq2kf/d_convolution_neural_network_visualization_made/
https://mp.weixin.qq.com/s/tmx59J75wuRii4RuOT8TTg
https://vimeo.com/stefsietz
http://portfolio.stefansietzen.at/
http://visuality.at/vis2/detail.html