MobileNetV2模型的簡單理解及其代碼實現

Mobilenet是為了終端設備計算機視覺應用而誕生的,特點是可配置參數量、低延時、耗存小、運行高效且精準度不遜色太多,屬於輕量化模型,目前已出V1和V2版本。V1的特點是depthwise和pointwise即可分離卷積,其源代碼google已開源到tensorflow/models。而V2論文(arxiv.org/pdf/1801.0438)發表於今年一月份,暫無官方實現代碼,它是V1的改善版本,創新點如下:

1. Inverted residuals

先經過一個[1, 1]的conv2d將輸入通道數擴張以便獲取到更多的特徵,然後再由[3, 3]的separable_conv2d進行特徵提取,最後再由[1, 1]的conv2d產生相應的輸出通道數。常見的residuals結構往往是先將輸入通道數壓縮再提取特徵最後輸出相應的特徵通道數,對於通道數來說中間小兩頭大。而倒殘差結構的特點是:先對輸入特徵通道擴張,再提取特徵,最後輸出相應的特徵通道,對於通道數來說有點中間大兩頭小類似於梭子的形狀,所以稱這樣的結構為 Inverted residuals(倒殘差結構)。他們的特點區別如下:

2.Linear bottlenecks

為了避免Relu對特徵的破壞,在residual block的Eltwise sum之前的那個 1*1 Conv 不再採用Relu6,而是直接線性輸出,作者說這樣可以避免Relu對特徵的破壞同時保留更多的特徵參數,提高模型準確率。

MobileNetV2的神經網路結構如下:

官方給出的結構圖存在問題了,這裡對stribe做了一些調整以使得第四和第五個bottleneck的特徵輸出圖大小如官方所定義。

關鍵的inverted bottleneck block代碼如下:

def inverted_block(net, input_filters, output_filters, expand_ratio, stride, scope=None): fundamental network struture of inverted residual block with tf.name_scope(scope): res_block = slim.conv2d(inputs=net, num_outputs=input_filters * expand_ratio, kernel_size=[1, 1]) # depthwise conv2d res_block = slim.separable_conv2d(inputs=res_block, num_outputs=None, kernel_size=[3, 3], stride=stride, depth_multiplier=1.0, normalizer_fn=slim.batch_norm) res_block = slim.conv2d(inputs=res_block, num_outputs=output_filters, kernel_size=[1, 1], activation_fn=None) # stride 2 blocks if stride == 2: return res_block # stride 1 block else: if input_filters != output_filters: net = slim.conv2d(inputs=net, num_outputs=output_filters, kernel_size=[1, 1], activation_fn=None) return tf.add(res_block, net)

residual block architectures如下:

我實現的MobileNetV2模型

主要是參考了MobileNetV1的實現方法,但去掉了depth_multiplier和output_stride,同時,結合了inverted bottleneck block和Linear bottlenecks的主要思想,目前調試可運行,且在facenet中應用於人臉特徵提取效果還行,已開源到github上,git倉庫地址如下:

xsr-ai/MobileNetv2_TF

因本人才疏學淺,在人工智慧領域也是在摸石頭過河,所以,也希望各位大牛指出我理解錯誤的地方,一同探討MobileNetV2的最佳實現方法。

推薦閱讀:

如何用 TensorFlow 打造 Not Hotdog 的移動應用
Tensorflow 免費中文視頻教程,開源代碼,免費書籍.
2017谷歌雲大會上的教程:沒有博士學位如何玩轉TensorFlow和深度學習
【博客存檔】TensorFlow入門一
Tensorflow 在 Android 平台的移植

TAG:TensorFlow | 計算機視覺 | 深度學習DeepLearning |