工作記錄: 在自己數據庫上運行TF-SSD——training Debug篇

用修改後的tf_convert_data.py處理自己的數據庫,整理成多個.tfrecord文件之後,便是本篇要講的部分。

首先,運行以下代碼片1:

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
    --train_dir=${TRAIN_DIR} \
    --dataset_dir=${DATASET_DIR} \
    --dataset_name=optimal_z_2017 \
    --dataset_split_name=train \
    --model_name=ssd_300_vgg \
    --checkpoint_path=${CHECKPOINT_PATH} \
    --save_summaries_secs=60 \
    --save_interval_secs=600 \
    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --batch_size=32

結果顯示:

這裏寫圖片描述
.tfrecord讀取正常;

這裏寫圖片描述
創建卷積核失敗,錯誤如下(CPU不支持一些東西):

Executor failed to create kernel. Invalid argument: CPU BiasOp only supports NHWC.

查找原因,詳見Daniel2333的博客
這裏寫圖片描述
應該安裝gpu版本的TensorFlow;

進入venv3.4.3/lib/python3.4/site-packages執行以下命令:

pip uninstall tensorflow
pip install tensorflow-gpu

繼續運行代碼片1,出現OOM錯誤,根據該文章提示,應該是沒有采用batch或者batch太大導致的問題,設置batch爲16:

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
    --train_dir=${TRAIN_DIR} \
    --dataset_dir=${DATASET_DIR} \
    --dataset_name=optimal_z_2017 \
    --dataset_split_name=train \
    --model_name=ssd_300_vgg \
    --checkpoint_path=${CHECKPOINT_PATH} \
    --save_summaries_secs=60 \
    --save_interval_secs=600 \
    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --batch_size=16

開始運行:
這裏寫圖片描述

不過看到loss並沒有很快降低,而且始終在10~100之間波動,說明某些參數設置不合適。
(在已經訓練好的權重基礎上進行fine-tuning.)

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
    --train_dir=${TRAIN_DIR} \
    --dataset_dir=${DATASET_DIR} \
    --dataset_name=optimal_z_2017 \
    --dataset_split_name=train \
    --model_name=ssd_300_vgg \
    --checkpoint_path=${CHECKPOINT_PATH} \
    --save_summaries_secs=60 \
    --save_interval_secs=600 \
    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.01 \
    --learning_rate_decay_factor=0.94 \
    --batch_size=16

然後被告知數據庫中有一條目標框的值爲1.005328,要求[0,0.1],因此需要返回檢查數據庫。

創建test.py,內容如下:

import os

err_list=[]
label=''
for i in range(21761):
    t=i+1
    filepath=os.path.join('/home/user9/Desktop/OPTIMAL_Z_FINAL/positive_labels','%05d'%t + '.txt') 
    with open(filepath) as f:
        lines=f.readlines()
    no=0
    for line in lines:
        no=no+1
        # print(line)
        line=line.split()
        line=line[1:]
        line=[float(k) for k in line]
        a=line[0]-line[2]/2.
        b=line[1]-line[3]/2.
        c=line[0]+line[2]/2.
        d=line[1]+line[3]/2.
        # print('\tin line %d\t\t in file %05d.txt\n'%(no,t))
        try:
            label='a=%f'%a
            assert(a>=0.0)
            label='b=%f'%b
            assert(b>=0.0)
            label='c=%f'%c
            assert(c<=1.0)
            label='d=%f'%d
            assert(d<=1.0)
        except:
            err_list.append((label,no,t))
            continue
for err in err_list:
    print err

打開ipython,輸入run test.py
這裏寫圖片描述
(出錯的值,行數,圖片編碼)

繼續輸入以下代碼篩選

for err in err_list:
    tmp=err[0][2:]
    tmp=float(tmp)
    if(tmp<=0.0 or tmp>1.0):
        print err

這裏寫圖片描述
打算不採用這些數據,因此,直接在數據庫根目錄下找到train_tf.txt和valid_tf.txt,刪除其中相應的序號即可,然後運行:

python tf_convert_data.py --output_name=voc_train 
python tf_convert_data.py --output_name=voc_valid

一定要注意,運行這條命令一定要在Python2環境下,因爲Python3已經取消了decode,改用byte替代了,如果用Python3運行會報錯.

然後修改optimal_z_2017中的訓練集、測試集的數量(因爲從數據集中刪除了圖片,因此數量也應修改):
這裏寫圖片描述

重複以上代碼,進行訓練,仍然和以上情況相同,陷入局部最優解。
那麼,繼續調參。。。
沒有任何效果。。。

嘗試從頭開始訓練:
(採用vgg從頭開始訓練)

DATASET_DIR=/home/user9/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user9/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/vgg_16.ckpt
python train_ssd_network.py \
    --train_dir=${TRAIN_DIR} \
    --dataset_dir=${DATASET_DIR} \
    --dataset_name=optimal_z_2017 \
    --dataset_split_name=train \
    --model_name=ssd_300_vgg \
    --checkpoint_path=${CHECKPOINT_PATH} \
    --checkpoint_model_scope=vgg_16 \
    --checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --save_summaries_secs=60 \
    --save_interval_secs=600 \
    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --learning_rate_decay_factor=0.94 \
    --batch_size=16

仍然沒有效果
調節batch_size=24,這是目前我的服務器上能夠接受的最大batch,再打就OOM了。然而,仍然沒有效果。。。

最終,決定切換服務器,到一個更大的服務器上去跑。。。
可以參考服務器批量拷貝命令

scp -r file user@xxx.xxx.xx.xxx:/home/user/filepath

把所有的數據和代碼複製到另一個服務器上,並在該服務器上搭建Python3虛擬環境。

仍然選擇採用一個在Imagenet基礎上訓練的權重文件,以及其他部分權重隨機初始化,從頭開始訓練(注意修改了路徑,增大了batch_size):
(吐槽一下:然而切換到另一個服務器上,把之前的工作全都搞好之後,運行以下命令發現,這個新服務器上裝的是CUDA7,不支持代碼,簡直哭了。。。於是,又裝了一波cuda8,cudnn5)

最後,終於開始運行了:

DATASET_DIR=/home/user8/DATA/OPTIMAL_Z_FINAL
TRAIN_DIR=/home/user8/CODE/TF_SSD/SSD-Tensorflow-master/My_chkp
CHECKPOINT_PATH=/home/user8/CODE/TF_SSD/SSD-Tensorflow-master/checkpoints/vgg_16.ckpt
python train_ssd_network.py \
    --train_dir=${TRAIN_DIR} \
    --dataset_dir=${DATASET_DIR} \
    --dataset_name=optimal_z_2017 \
    --dataset_split_name=train \
    --model_name=ssd_300_vgg \
    --checkpoint_path=${CHECKPOINT_PATH} \
    --checkpoint_model_scope=vgg_16 \
    --checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --save_summaries_secs=60 \
    --save_interval_secs=600 \
    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --learning_rate_decay_factor=0.94 \
    --batch_size=50

由於gpu容量大,允許batch設置的比較大,於是我設置了50的batch_size,這樣產生的效果:
剛剛開始迭代
這裏寫圖片描述
500次迭代
這裏寫圖片描述
1000次迭代
這裏寫圖片描述
2000次迭代
這裏寫圖片描述
可以看到,雖然仍有波動,但是經過近千次迭代,loss值已經穩定在比較低的值了,隨着時間的推移,loss應該會繼續下降,最終收斂。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章