用修改後的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應該會繼續下降,最終收斂。