終于要開 CNN(卷積神經網絡)這個神坑了。不過之所以說它神坑,是因為這里面牽扯到的數學概念相當相當多、導致如果只用 Numpy、從頭來實現的話會非常繁瑣。然而,如果只是理解它的直觀并且單純地實現它的話,由于有偉大的 tensorflow 框架、CNN 被極大地簡化成了一個平凡的東西
我打算在不帶星號的章節中說明如何運用 tensorflow 框架將 CNN 整合進我們之前實現的神經網絡框架中、并在帶星號的章節中說明如何使用純 Numpy 從頭實現一個 CNN 框架。CNN 坑就坑在帶星號的章節,所以觀眾老爺們大可帶著輕松愉悅的心情食用不帶星號的章節 ( σ'ω')σ
這一章主要講 CNN 的一些非?;镜母拍睢J紫任蚁胫赋龅氖牵簭慕Y構上來說,樸素的 CNN 和樸素的 NN 沒有任何區別(當然,復雜的 CNN 會和 NN 有著比較大的區別)。這意味著樸素的 CNN 包含且只包含下列兩個東西:
單獨的層級結構 Layer
將 Layer 整合在一起的網絡結構
所以在實現算法時我們要做的、無非就是把之前實現的 NN 相應的部分進行分情況討論
知道了結構后,我們就要來看 CNN 的思想了。總的來說可以把它概括成以下兩點:
局部連接(Sparse Connectivity)
權值共享(Shared Weights)
它們有很好直觀。舉個栗子,我們平時四處看風景時,都是“一塊一塊”來看的、信息也都是“一塊一塊”地接收的(所謂的【局部感受野】)。在這個過程中,我們的思想在看的過程中通常是不怎么變的、而在看完后可能會發出“啊這風景好美”的感慨、然后可能會根據這個感慨來調整我們的思想。在這個栗子中,那“一塊一塊”的風景就是局部連接,我們的思想就是權值。我們在看風景時用的都是自己的思想,這就是權值共享的生物學意義(注:這個栗子是我開腦洞開出來的、完全不能保證其學術嚴謹性、還請各位觀眾老爺們帶著批判的眼光去看待它……如果有這方面專長的觀眾老爺發現我完全就在瞎扯淡、還望不吝指出 ( σ'ω')σ)
光用文字敘述可能還是有些懵懂,我來畫張圖(參考了一張被引用爛了的圖;但由于原圖有一定的誤導性、所以還是打算自己畫一個)(雖然很丑):
這張圖比較了 NN 和 CNN 的思想差別。左圖為 NN,可以看到它在處理輸入時是全連接的、亦即它采用的是全局感受野,同時各個神經元又是相對獨立的、這直接導致它難以將原數據樣本翻譯成一個“視野”。而正如上面所說,CNN 采用的是局部感受野 + 共享權值,這在右圖中的表現為它的神經元可以看成是“一整塊”的“視野”,這塊視野的每一個組成部分都是共享的權值(右圖中那些又粗又長的綠線)在原數據樣本的某一個局部上“看到”的東西
接下來就粗略地講講怎么實現這種思想、亦即如何實現 CNN 里面的前傳算法。具體的定義會在數學系列里面進行說明,這里就只放代碼核心了(Again,tensorflow 大法好!)
def _conv(self, x, w): return tf.nn.conv2d(x, w, strides=[self._stride] * 4, padding=self._pad_flag)def _activate(self, x, w, bias, predict): res = self._conv(x, w) + bias return layer._activate(self, res, predict)
這里面涉及到一些以后會說明的東西,但如果知道概念的話、代碼應該還是相當可讀的
-
cnn
+關注
關注
3文章
353瀏覽量
22246 -
Layer
+關注
關注
0文章
17瀏覽量
6654
原文標題:從零開始學人工智能(8)--Python · 神經網絡(七)· CNN
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論