神經網路的參數計算

這篇文章會利用keras定義幾種基本的網路,分析網路的參數大小,當然如果你用tf這些去定義網路,很多時候定義的時候就已經知道了你的參數大小。因此,這裡只是想通過參數的計算來進一步理解這幾種網路。最後會分享一篇我覺得寫的很好的,分析深度學習中的GPU和顯存的文章。

1.最簡單的全連接網路

這裡定義了一個輸入為(None,10),兩個隱層神經元數分別為4和6的網路。

這個很簡單:4*10+4=44 , 6*4+6=30,用文字表達就是 輸入長度*該層神經元個數+偏置(該層神經元個數)=該層參數。

2.卷積神經網路CNN

這裡定義了一個輸入為(None,64,64,3),第一個卷積層的卷積核為(64,3,3),第二個卷積層的卷積核為(32,5,5)的網路。

也很簡單:3*3*3*64+64=1792,5*5*64*32+32,用文字表達一下就是:卷積核的寬*卷積核的長*輸入的通道數*卷積核的個數+卷積核個數=該層的總參數,這裡卷積核的個數就是卷積的通道數的意思,因為,對每個卷積核,都要去卷積輸入的每個通道。當然這是標準卷積的做法,你是否會覺得這樣需要的參數太多了?是的,像mobileNet和ShuffleNet等這些輕型網路就不是這樣的做的,每個卷積核只負責一部分通道,或者只負責一個通道,你可以算算這其中減少的參數是多少?當然損失了部分全局信息還要保證準確率,那就要考慮如何去「串」起每個卷積核卷積出來的特徵了。如果你對這些還不了解的話,可以看看這篇文章。

3.長短時循環神經網路LSTM

這裡定義了輸入為(None,10,64),第一層隱層數為64,返回整個序列,第二層隱層數為10,返回最後一個時刻的輸出。

也很簡單,rnn每一時刻的參數是共享的,返回序列與否參數都是一樣的。(64*64+64*64+64)*4=33024,(10*64+10*10+10)*4=3000.

用文字表達就是(隱層神經元數*輸入的維度+隱層神經元數*隱層神經元數(上一時刻的隱層輸入)+偏置(隱層神經元數))*4=該層總參數,乘以4是因為LSTM有三種不同的門,輸入門,遺忘門,輸出門,再加上一個輸入,而且計算方式都如括弧里的一樣。

需要明白的一點是,儘管LSTM每個時刻參數共享,但每個時刻還是要計算參數的,也就是減少了內存,但總的計算時間可以認為一樣。

先寫到這吧。當然,僅僅知道怎麼計算參數還是不行,還需要知道參數跟內存或者顯存的關係,以便在實際應用的時候更好地平衡你的模型和運算設備性能。這篇文章詳細科普了深度學習中GPU和顯存的情況,值得一看!^^

推薦閱讀:

TAG:神經網路 | 深度學習DeepLearning | 卷積神經網路CNN |