1. 程式人生 > >如何自學深度神經網路-個人經驗

如何自學深度神經網路-個人經驗

研究生入學已經半年了,這半年裡除了上課就是在自學深度學習相關的東西,乘著寒假在家閒著寫點東西。

剛入學的時候因為我們要對一些不同風格的字型進行分類,一開始我用的是Gabor來提取特徵,然後用SVM進行分類,雖然實驗結果還可以,但是人機互動太多有點不方便,而且執行速度也不夠快。因為我平常關注一些機器學習的公眾號,看裡面經常提起什麼卷積神經網路這些概念,一開始也不是很懂,然後我就在網上查了很多資料,決定開始自學神經網路。

首先我看了斯坦福的UFLDL教程,詳細地看了一下里面關於BP網路的推導過程,因為數學基礎不是很好,看懂推導過程也花了不少時間。光說不練假把式嘛,根據推匯出來的結論,我用MATLAB嘗試著編了一下程式,這真的是一個艱辛的過程,程式雖然寫出來了,但是我一直不確定到底寫對沒,因為當時剛開始學,也不知道該怎麼來證明。後來我想了一下,乾脆用之前Gabor提取的字型特徵來當資料,輸入進去之後,發現損失值並沒有減小,用了更小的學習率也還是不行,看來程式肯定哪裡寫錯了。接著我就開始在程式裡找錯誤,因為資料量很大,除錯程式根本找不出錯誤在哪裡,一遍一遍的看程式,終於還是找到了錯誤,程式碼裡面有個小錯誤,改完以後,損失值果然按照預期減小了,真的是喜聞樂見,都快把我高興壞了,這個BP網路只是踏出的一小步,不過也算一個小成就吧。

只有一個BP網路當然滿足不了我們的需求,太侷限了。有一次在網上看到一個公開課的教程,真覺得很受益,就是斯坦福的CS231n,主講教師是Fei-Fei Li和她的兩個學生Andrej Karpathy 和 Justin Johnson(最近還看了Jusin的一篇論文,快速風格轉移)。CS231n課程裡面從K近鄰和cifar10資料集開始給大家講了如何對資料集進行分類以及怎麼提高分類識別率,講了各種神經網路演算法,從基礎的梯度下降、梯度優化演算法等通俗易懂地講了神經網路引數優化的過程,後面又詳細講解了卷積神經網路(CNN)裡面的各種引數以及實現。這個教程很適合從零基礎開始學。

學完CS231n已經有了神經網路的基礎知識了,因為我們的目的是要應用。大型的深度神經網路靠自己用梯度下降演算法來搭建不太現實,不過有能力的同學可以嘗試一下。現成有很多框架能用,如Tensorflow、Caffe、Pytorch等。現在用的最多的還是Tensorflow,這個框架主要是用圖的結構來搭建網路,我只學了Tensorflow也不好評價其他的框架,不過我覺得Tensorflow用起來還行,不過也有很多人說不好用。大家如果想學的話可以買本書,不過我還是建議網上的資料看看就行了,我就是看

Tensorflow中文社群自學的,那裡面講得真挺好的,可以先根據中文社群裡面提供的一個卷積神經網路跑一下,不過最好把這個程式裡面每一個細節都搞明白,搞明白後再自己嘗試搭建一些大型的網路結構,如AlexNetVGGNetGoogLeNetResNet等,這些網路如果寫不出來也可以參考別人寫的,github上搜一下很多,我以前也是寫不出來就參考別人怎麼寫的,然後就模仿別人的程式設計方法,後來自然而然就會了。

跑深度神經網路也有很多技巧,我自己在做實驗的時候感受最深的是:網路中沒有Batch Normalization對不同字型識別率大概到93%就是極限了,不管怎麼調整網路引數就是上不去,當我加入Batch Normalization後識別率驚人的穩定在了97%。當然除了BN還有很多,比如資料增強、Dropout、提前中斷訓練、學習率指數衰減等。

今天就先說到這了,之後我再詳細談一下卷積神經網路(CNN)、生成對抗網路(GANs)、風格轉移(Style Transfer)、膠囊網路(Capsule)

還有大家如果對深度學習以及神經網路感興趣的話,希望能夠關注我的Github主頁,我會把我的程式碼傳上去,大家可以下載下來在自己電腦上跑一下,有些程式還是蠻有意思的:-D

希望大家多多支援。

--------------------- 本文來自 MarTin Guo 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/Geoffrey_MT/article/details/79346674?utm_source=copy