實習終于結束了,現把實習期間做的基于人體姿態估計的模型小型化的工作做個總結。
現在深度學習模型開始走向應用,因此我們需要把深度學習網絡和模型部署到一些硬件上,而現有一些模型的參數量由于過大,會導致在一些硬件上的運行速度很慢,所以我們需要對深度學習模型進行小型化處理。模型小型化旨在保證模型效果不會明顯下降的情況下降低模型的參數量,從而提高模型的運算速度。
以下是幾種模型小型化的方法:
1、修改某些卷積層的num_output
其實很多模型的參數都有冗余,有些層根本不需要很多的卷積核,所以,通過修改該參數可以降低一部分的參數量。
2、使用分離通道卷積(depthwise separable convolution)
對某些卷積層使用分離通道卷積的方法。使用分離通道卷積可以去掉一部分冗余的參數。分離通道卷積與常用卷積的不同之處在于,標準卷積操作中,每個卷積核都要對輸入的所有通道的特征進行卷積,然后結合生成一個對應的特征。分離通道卷積中,分為兩步,第一步使用分離通道卷積,每個卷積核只對一個通道進行卷積。第二步,使用1x1的標準卷積整合分離通道卷積輸出的特征。分離通道卷積時,各個通道之間的特征信息沒有交互,之后會采用一個1*1的標準卷積運算,使分離通道卷積輸出的特征的通道之間的信息有了一個交互。在tensorflow中,有對應的tf.nn.depthwise_conv2d接口可以很方便地實現分離通道卷積。
標準卷積和分離通道卷積的示意圖如下
參考論文:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
3、使用channel shuffle方法
channel shuffle方法是在分離通道卷積方法的基礎上做的改進,將分離通道卷積之后的1*1的全卷積替換為channel shuffle。
參考論文:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
4、使用ThiNet方法
ThiNet方法是尋找一些對輸出特征貢獻較小的卷積核,將其裁剪掉,從而降低參數量。屬于第一種方法的延伸。
參考論文:ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression
5、改變網絡結構
現在常見的網絡結構有:以VGG為代表的單支流網絡結構,GoogLeNet的Inception類型的網絡結構,ResNet的殘差結構,還有DenseNet的結構(類似殘差結構,把殘差結構中特征的相加變為特征拼接)。在曾經的ImageNet的比賽中,GoogLeNet取得了比VGG更好的成績,但是GoogLeNet的參數量卻比VGG小很多,這說明通過改變網絡結構,我們不僅可以減低模型的參數量,還可能會提升模型的效果。
前四種方法都是在原有網絡上進行的操作,一般不會對網絡結構造成太大改變。而第五種方法則是徹底改變了網絡的結構。
我們將模型的參數量降低后,如果隨機初始化,模型由于參數量較小,很難達到原有的效果,所以構造了新的網絡之后還會涉及到重構。
重構其實是為了得到一個較好的初始化模型。我們一般去重構網絡的倒數第二層的輸出特征,因為最終的結果都是在倒數第二層的輸出特征上得到的。但有時我們還會去重構其他卷積層輸出的特征,比如一個較深的網絡,我們單純地去重構倒數第二層的特征也很難得到一個較好的初始化模型,因為監督信息(即重構時的loss)太靠后,前面的層很難學習到,所以有時我們可以將網絡分為幾個部分,依次重構,先重構前面的,然后使用重構好的模型去重構后面的部分。
使用ThiNet方法,每裁剪完一層之后都要做finetunign,然后再裁剪下一層。我們也可以每裁剪完一層之后去做重構,全部都裁剪完之后,做姿態估計訓練。
我們還可以重構和姿態估計訓練一起做,使用兩個監督信息(即重構和姿態估計兩個loss)使模型邊重構邊訓練,我們將其稱為mimick。
這就是我在模型小型化的工作中使用到的一些方法。但如何使用這些方法才能得到一個好的結果,這還需要親自去嘗試。
-
深度學習
+關注
關注
73文章
5500瀏覽量
121111
發布評論請先 登錄
相關推薦
評論