等了這么久終于要開始寫Xception的讀后感了灶搜,其實看過了Google Inception系列(V1~V4)的這幾篇文章后再看這篇Xception是蠻好懂的祟蚀。本文作者是Keras之父寫的,所以出現(xiàn)Keras和Tensorflow還是很多的割卖。
本文最重要的東西是深度可分離卷積(Depthwise Separable Convolutions)前酿,在它的基礎(chǔ)上建立了Xception block。借鑒一下它的例子https://blog.csdn.net/Chaolei3/article/details/79374563來解釋什么是深度可分離卷積:
假設(shè)有一個3×3大小的卷積層鹏溯,其輸入通道為16罢维、輸出通道為32。 那么一般的操作就是用32個3×3的卷積核來分別同輸入數(shù)據(jù)卷積丙挽,這樣每個卷積核需要3×3×16個參數(shù)肺孵,得到的輸出是只有一個通道的數(shù)據(jù)。之所以會得到一通道的數(shù)據(jù)颜阐,是因為剛開始3×3×16的卷積核的每個通道會在輸入數(shù)據(jù)的每個對應(yīng)通道上做卷積平窘,然后疊加每一個通道對應(yīng)位置的值,使之變成了單通道凳怨,那么32個卷積核一共需要(3×3×16)×32 =4068個參數(shù)瑰艘。
而深度可分離卷積的計算過程是怎么樣的呢?下看下圖一:
深度可分離卷積的過程是用16個3×3大小的卷積核(1通道)分別與輸入的16通道的數(shù)據(jù)做卷積(這里使用了16個1通道的卷積核,輸入數(shù)據(jù)的每個通道用1個3×3的卷積核卷積)磅叛,得到了16個通道的特征圖屑咳,我們說該步操作是depthwise(逐層)的萨赁,在疊加16個特征圖之前弊琴,接著用32個1×1大小的卷積核(16通道)在這16個特征圖進(jìn)行卷積運算,將16個通道的信息進(jìn)行融合(用1×1的卷積進(jìn)行不同通道間的信息融合)杖爽,我們說該步操作是pointwise(逐像素)的敲董。這樣我們可以算出整個過程使用了3×3×16+(1×1×16)×32 =656個參數(shù)。這就是所謂的深度可分離通道慰安。
其實這篇文章核心的東西就這么一點腋寨,其他開都主要分析了由Inception結(jié)構(gòu)引發(fā)的思考,然后一步步推理到深度可分離卷積化焕。然后在介紹完這個深度可分離卷積之后萄窜,作者在這個基礎(chǔ)上提出了Xception,結(jié)構(gòu)如下圖二:
Xception其實就是帶殘差連接的深度可分離卷積層的線性堆疊撒桨,可以從圖中看到在跳躍連接這里用1x1卷積進(jìn)行了降維查刻,同時因為在Xception block里進(jìn)行了池化,特征圖縮小了凤类,所以為了可以正常完成恒等映射穗泵,1x1卷積的步長變大了。
如上圖三的Xception架構(gòu)是基于Keras寫的谜疤,可以對應(yīng)著看佃延,Tensorflow已經(jīng)集成了深度可分離卷積,不知道其他框架有沒有夷磕。