Keras 多工實現,Multi Loss #########Keras Xception Multi loss 細粒度影象分類
阿新 • • 發佈:2018-11-04
這裡只摘取關鍵程式碼:
# create the base pre-trained model input_tensor = Input(shape=(299, 299, 3)) base_model = Xception(include_top=True, weights='imagenet', input_tensor=None, input_shape=None) plot_model(base_model, to_file='xception_model.png') base_model.layers.pop() base_model.outputs = [base_model.layers[-1].output] base_model.layers[-1].outbound_nodes = [] base_model.output_layers = [base_model.layers[-1]] feature = base_model img1 = Input(shape=(299, 299, 3), name='img_1') img2 = Input(shape=(299, 299, 3), name='img_2') feature1 = feature(img1) feature2 = feature(img2) # Three loss functions category_predict1 = Dense(100, activation='softmax', name='ctg_out_1')( Dropout(0.5)(feature1) ) category_predict2 = Dense(100, activation='softmax', name='ctg_out_2')( Dropout(0.5)(feature2) ) dis = Lambda(eucl_dist, name='square')([feature1, feature2]) model = Model(inputs=[img1, img2], outputs=[category_predict1, category_predict2, judge]) model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss={ 'ctg_out_1': 'categorical_crossentropy', 'ctg_out_2': 'categorical_crossentropy', 'bin_out': 'categorical_crossentropy'}, loss_weights={ 'ctg_out_1': 1., 'ctg_out_2': 1., 'bin_out': 0.5 }, metrics=['accuracy'])
如果覺得我的工作對你有幫助,就點個star吧
關於
這是百度舉辦的一個關於狗的細粒度分類比賽,比賽連結: http://js.baidu.com/
框架
硬體
- Geforce GTX 1060 6G
- Intel® Core™ i7-6700 CPU
- Memory 8G
模型
- Xception提取深度特徵
- 受這篇Person Re-id論文的啟發,在多分類基礎上增加一個樣本是否相同判斷的二分類loss,增加類間距離,減小類內距離
Keras實現
- 去掉Xception最後用於imagenet分類的全連線層,獲取影象深度特徵
- 輸入兩張圖片,可能屬於相同類也可能屬於不同類
- 根據特徵和標籤進行多分類訓練
- 同時以兩圖是否屬於同一類作為二分類標籤訓練
資料預處理
- 從Baidu雲下載資料
- 訓練集: http://pan.baidu.com/s/1slLOqBz Key: 5axb
- 測試集: http://pan.baidu.com/s/1gfaf9rt Key:fl5n
- 按類別把圖片放在不同的目錄下,方便ImageDataGenerator的使用
- 因為先前我把圖片命名為這種格式"typeid_randhash.jpg"了, 所以我寫了這段程式碼來做圖片移動的工作img2keras.py
- 資料預處理還有許多細節要處理,遇到問題的話可以先檢視keras的文件,如果還有問題,可以提issue.
訓練
- 使用Keras的ImageDataGenerator介面進行資料增廣
- 同時使用ImageDataGenerator做資料增廣並進行正負樣本對取樣是一個難點.因為從ImageDataGenerator獲得的圖片被打亂了.
遍歷資料集找同類樣本作為正樣本效率很低,幸運的是,在每個batch中,存在同類的樣本,所以我們可以通過在同一個batch中交換同類樣本的位置,構造出包含正樣本對的另一個輸入. - 凍結Xception的卷積層,採用ADMM訓練多分類和二分類模型.
- 解凍Xception卷積層的最後兩個block(總共有12個block,最後兩個block從Xception的105層開始)繼續使用SGD訓練
- 去掉資料增廣,再訓練直至收斂
程式碼
- 單一Xception模型
- 訓練: single_model.py
- 測試: single_model_test.py
- Multi loss模型
- 凍結訓練全連線層+微調卷積層: froze_fine_tune.py
- Trick微調: trick_tune.py
- 測試: baidu_dog_test.py
一些測試結果
- InceptionV3,多分類模型: 0.2502
- Xception,多分類模型: 0.2235
- Xception, 混合模型: 0.211
- Xception, 混合模型,最後去掉資料增廣再訓練: 0.2045