當(dāng)前位置:首頁(yè) > IT技術(shù) > 移動(dòng)平臺(tái) > 正文

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)
2021-08-09 19:12:26

?

00

?

引言

現(xiàn)在很多的圖像算法都是離線計(jì)算的,而學(xué)術(shù)界刷榜單那些模型,什么vgg16,resnet152是不能直接拿來(lái)用的,所以,對(duì)于一個(gè)深度學(xué)習(xí)算法工程師來(lái)說(shuō),如果在這些模型的基礎(chǔ)上,設(shè)計(jì)出一個(gè)又小又快的滿足業(yè)務(wù)需求的模型,是必備技能,今天就來(lái)簡(jiǎn)單討論一下這個(gè)問題。

?

首先,祭出一個(gè)baseline,來(lái)自Google的mobilenet,算是學(xué)術(shù)界祭出的真正有意義的移動(dòng)端模型。

?

當(dāng)然,這里我們要稍微修改一下,畢竟原始的mobilenet是分類模型過(guò)于簡(jiǎn)單無(wú)法展開更多,我們以更加復(fù)雜通用的一個(gè)任務(wù)開始,分割,同時(shí)修改一下初始輸入尺度,畢竟224這個(gè)尺度在移動(dòng)端不一定被采用,我們以更小的一個(gè)尺度開始,以MacBookPro為計(jì)算平臺(tái)。

?

在原有mobilenet的基礎(chǔ)上添加反卷積,輸入網(wǎng)絡(luò)尺度160*160,網(wǎng)絡(luò)結(jié)構(gòu)參考mobilenet,只是在最后加上反卷積如下

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_深度學(xué)習(xí)

如果誰(shuí)有可以可視化caffe網(wǎng)絡(luò)結(jié)構(gòu)圖并保存成高清圖片的方法,請(qǐng)告訴我一下,netscope不能保存圖,graphviz的圖又效果很差,所以這里沒有放完整結(jié)構(gòu)圖。

?

不過(guò),大家可以去參考mobilenet,然后我們?cè)趍ac上跑一遍,看看時(shí)間代價(jià)如下:

?

其中黃色高亮是統(tǒng)計(jì)的每一個(gè)module的時(shí)間和。

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_知乎_02

準(zhǔn)備工作完畢,接下來(lái)開始干活。

01

?

?分析網(wǎng)絡(luò)的性能瓶頸

1.1 運(yùn)行時(shí)間和計(jì)算代價(jià)分析

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_性能瓶頸_03【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_知乎_04

上面兩圖分別是網(wǎng)絡(luò)的計(jì)算時(shí)間和計(jì)算量,從上面我們總結(jié)幾條規(guī)律:

?

(1) 耗時(shí)前5,conv2_1_sep,conv6_sep,conv3_1_sep,conv3_1_dw,conv2_1_dw。

我們看看為什么,

conv2_1_dw計(jì)算量,32*80*80*3*3*1=1843200

conv2_1_sep計(jì)算量,32*80*80*1*1*64=13107200

conv3_1_dw計(jì)算量,128*40*40*3*3*1=1843200

conv3_1_sep計(jì)算量,128*40*40*1*1*128=26214400

conv6_sep計(jì)算量,1024*5*5*1*1*1024=26214400

上面可以看出,計(jì)算量最大的是conv6_sep,conv2_1_sep,理論上conv2_1_dw計(jì)算量與conv2_1_sep不在一個(gè)量級(jí),但是實(shí)際上相當(dāng),這是庫(kù)實(shí)現(xiàn)的問題。

?

(2) 從conv5_1到conv5_5,由于尺度不發(fā)生變化,通道數(shù)不發(fā)生變化,所以耗時(shí)都是接近的,且dw模塊/sep模塊耗時(shí)比例約為1:3。

前者計(jì)算量:512*10*10*3*3

后者計(jì)算量:512*10*10*1*1*512

這一段網(wǎng)絡(luò)結(jié)構(gòu)是利用網(wǎng)絡(luò)深度增加了非線性,所以對(duì)于復(fù)雜程度不同的問題,我們可以縮減這一段的深度。

?

1.2 網(wǎng)絡(luò)參數(shù)量分析

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_知乎_05

從上面我們可以看出,參數(shù)量集中在conv6_sep,conv5_6_sep,conv5_1~5_5,所以要壓縮模型,應(yīng)該從這里地方入手。

?

當(dāng)我們想設(shè)計(jì)更小的mobilenet網(wǎng)絡(luò)時(shí),有3招是基本的,一定要用。

(1) 降低輸入分辨率,根據(jù)實(shí)際問題來(lái)設(shè)定。

(2) 調(diào)整網(wǎng)絡(luò)寬度,也就是channel數(shù)量。

(3) 調(diào)整網(wǎng)絡(luò)深度,比如從conv4_2到conv5_6這一段,都可以先去試一試。

02

?

開始調(diào)整網(wǎng)絡(luò)

在做這件事之前,我們先看看經(jīng)典網(wǎng)絡(luò)結(jié)構(gòu)的一些東西,更具體可以參考之前的文章。

https://zhuanlan.zhihu.com/p/25797790

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_移動(dòng)端_06

從上面的表看,主流網(wǎng)絡(luò)第一個(gè)卷積,kernel=3,stride=2,featuremap=64,mobilenet系列已經(jīng)降到了32。

?

第1層是提取邊緣等信息的,當(dāng)然是featuremap數(shù)量越大越好,但是其實(shí)邊緣檢測(cè)方向是有限的,很多信息是冗余的, 由于mobilenet優(yōu)異的性能,事實(shí)證明,最底層的卷積featuremap channel=32已經(jīng)夠用。

?

實(shí)際的任務(wù)中,大家可以看conv1占據(jù)的時(shí)間來(lái)調(diào)整,不過(guò)大部分情況下只需要選擇好輸入尺度大小做訓(xùn)練,然后套用上面的參數(shù)即可,畢竟這一層占據(jù)的時(shí)間和參數(shù),都不算多,32已經(jīng)足夠好足夠優(yōu)異,不太需要去調(diào)整的。

?

自從任意的卷積可以采用3*3替代且計(jì)算量更小后,網(wǎng)絡(luò)結(jié)構(gòu)中現(xiàn)在只剩下3*3和1*1的卷積,其他的尺寸可以先不考慮。

?

采用80*80輸入,砍掉conv5_6和conv6,得到的模型各層花費(fèi)時(shí)間如下

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_深度學(xué)習(xí)_07

總共274ms,我們稱這個(gè)模型為mobilenet_v0。

?

2.1 如何決定輸入尺度

輸入尺度絕對(duì)是任務(wù)驅(qū)動(dòng)的,不同的任務(wù)需要不同的輸入尺度,分割比分類需要尺度一般更大,檢測(cè)又比分割所需要的尺度更大,在這里,我們限定一個(gè)比較簡(jiǎn)單的分割任務(wù),然后將輸入尺度定為80*80,就將該任務(wù)稱為A吧。

?

2.2 如何調(diào)整網(wǎng)絡(luò)寬度與深度

通道數(shù)決定網(wǎng)絡(luò)的寬度,對(duì)時(shí)間和網(wǎng)絡(luò)大小的貢獻(xiàn)是一個(gè)乘因子,這是優(yōu)化模型首先要做的,下面開始做。

?

2.2.1 反卷積

?

看上面的模型我們可以看出,反卷積所占用時(shí)間遠(yuǎn)遠(yuǎn)大于前面提取特征的卷積,這是因?yàn)槲覀儧]有去優(yōu)化過(guò)這個(gè)參數(shù)。那么,到底選擇多少才合適呢?

?

在這里經(jīng)驗(yàn)就比較有用了。卷積提取特征的過(guò)程,是featuremap尺度變小,channel變大,反卷積正好相反,featuremap不斷變大,通道數(shù)不斷變小。這里有4次放大2倍的卷積,考慮到每次縮放一倍,所以第一次的channel數(shù)量不能小于2^4=16,一不做二不休,我們干脆就干為16。

?

我們稱這個(gè)模型為mobilenet_v1

?

我們看下時(shí)間對(duì)比

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_性能瓶頸_08

再看下性能對(duì)比。

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_深度學(xué)習(xí)_09

這樣,一舉將模型壓縮5倍,時(shí)間壓縮5倍,而且現(xiàn)在反卷積的時(shí)間代價(jià)幾乎已經(jīng)可以忽略。

?

2.2.2 粗暴地減少網(wǎng)絡(luò)寬度

?

接下來(lái)我們?cè)俜祷氐?部分,conv5_1到conv5_5的計(jì)算量和時(shí)間代價(jià)都是不小的,且這一部分featuremap大小不再發(fā)生變化。這意味著什么?這意味著這一部分,純粹是為了增加網(wǎng)絡(luò)的非線性性。

?

下面我們直接將conv5_1到conv5_5的featuremap從512全部干到256,稱其為mobilenet2.1.1,再看精度和時(shí)間代價(jià)。

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_移動(dòng)端_10

時(shí)間代價(jià)和網(wǎng)絡(luò)大小又有了明顯下降,不過(guò)精度也有下降。

?

2.2.3 粗暴地減少網(wǎng)絡(luò)深度

?

網(wǎng)絡(luò)層數(shù)決定網(wǎng)絡(luò)的深度,在一定的范圍內(nèi),深度越深,網(wǎng)絡(luò)的性能就越優(yōu)異。但是從第一張圖我們可看出來(lái)了,網(wǎng)絡(luò)越深,featureamap越小,channel數(shù)越多,這個(gè)時(shí)候的計(jì)算量也是不小的。

?

所以,針對(duì)特定的任務(wù)去優(yōu)化模型的時(shí)候,我們有必要去優(yōu)化網(wǎng)絡(luò)的深度,當(dāng)然是在滿足精度的前提下,越小越好。

?

我們從一個(gè)比較好的起點(diǎn)開始,從mobilenet_v1開始吧,直接砍掉conv5_5這個(gè)block,將其稱為mobilenet_v2.1.2。

?

下面來(lái)看看比較。

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_卷積_11

從結(jié)果來(lái)看,精度下降尚且不算很明顯,不過(guò)時(shí)間的優(yōu)化很有限,模型大小壓縮也有限。

?

下面在集中看一下同時(shí)粗暴地減少網(wǎng)絡(luò)深度和寬度的結(jié)果,稱其為mobilenet_v2.1.3

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_移動(dòng)端_12

以損失將近1%的代價(jià),將模型壓縮到2.7m,40ms以內(nèi),這樣的結(jié)果,得看實(shí)際應(yīng)用能不能滿足要求了。

總之,粗暴地直接減小深度和寬度,都會(huì)造成性能的下降。

?

2.2.4 怎么彌補(bǔ)通道的損失

?

從上面我們可以看出,減少深度和寬度,雖然減小了模型,但是都帶來(lái)了精度的損失,很多時(shí)候這種精度損失導(dǎo)致模型無(wú)法上線。所以,我們需要一些其他方法來(lái)解決這個(gè)問題。

?

2.2.4.1 crelu通道補(bǔ)償

?

從上面可以看出,網(wǎng)絡(luò)寬度對(duì)結(jié)果的影響非常嚴(yán)重,如果我們可以想辦法維持原來(lái)的網(wǎng)絡(luò)寬度,且不顯著增加計(jì)算量,那就完美了。正好有這樣的方法,來(lái)源于這篇文章《Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units》,它指出網(wǎng)絡(luò)的參數(shù)有互補(bǔ)的現(xiàn)象,如果將減半后的通道補(bǔ)上它的反,會(huì)基本上相當(dāng)于原有的模型,雖然原文針對(duì)的是網(wǎng)絡(luò)淺層有這樣的現(xiàn)象,不過(guò)深層我們不妨一試,將其用于參數(shù)量和計(jì)算代價(jià)都比較大的conv5_1到conv5_4,我們直接從mobilenet_v2.1.3開始,增加conv5_1到conv5_4的網(wǎng)絡(luò)寬度,稱之為mobilenet_v2.1.4。

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_性能瓶頸_13

?

2.2.4.2 skip connect,融合不同層的信息

?

這是說(shuō)的不能再多,用的不能再多了的技術(shù)。從FCN開始,為了恢復(fù)分割細(xì)節(jié),從底層添加branch到高層幾乎就是必用的技巧了,它不一定能在精度指標(biāo)上有多少提升,但是對(duì)于分割的細(xì)節(jié)一般是正向的。

?

我們直接從mobilenet_v2.1.3開始,添加3個(gè)尺度的skip connection。由于底層的channel數(shù)量較大,deconv后的channel數(shù)量較小,因此我們添加1*1卷積改變通道,剩下來(lái)就有了兩種方案,1,concat。2,eltwise。

?

針對(duì)這兩種方案,我們分別進(jìn)行試驗(yàn)。

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_移動(dòng)端_14

從上表可以看出,兩個(gè)方案都不錯(cuò),時(shí)間代價(jià)和模型大小增加都很小,而精度提升較大。

?

現(xiàn)在反過(guò)頭回去看剛開始的模型v0,在精確度沒有下降的情況下,我們已經(jīng)把速度優(yōu)化了5倍以上,模型大小壓縮到原來(lái)的1/10,已經(jīng)滿足一個(gè)通用的線上模型了。

?

當(dāng)然,我們不可能道盡所有的技術(shù),而接著上面的思路,也還有很多可以做的事情,本篇的重點(diǎn),是讓大家學(xué)會(huì)分析性能網(wǎng)絡(luò)的性能瓶頸,從而針對(duì)性的去優(yōu)化網(wǎng)絡(luò)。更多類似技巧和實(shí)驗(yàn),作為技術(shù)人員,自己嘗試去吧。

?

?

?

注:部分圖片來(lái)自網(wǎng)絡(luò)

?

—END—

?

?

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_移動(dòng)端_15【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_知乎_16【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_性能瓶頸_17【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_卷積_18【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_移動(dòng)端_19

公眾號(hào)內(nèi)容

1 圖像基礎(chǔ)|2 深度學(xué)習(xí)|3 行業(yè)信息

【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_卷積_20【技術(shù)綜述】如何Finetune一個(gè)小網(wǎng)絡(luò)到移動(dòng)端(時(shí)空性能分析篇)_深度學(xué)習(xí)_21

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >