目錄
本教程教你在darknet框架下訓練一個分類器,使用cifar-10數據集。
安裝darknet
如果還沒安裝darknet,請先安裝,使用以下命令:
git clone https://github.com/pjreddie/darknet
cd darknet
make
數據集下載
使用以下命令下載數據集:
wget http://pjreddie.com/media/files/cifar.tgz
tar xzf cifar.tgz
數據集解壓後如下圖所示,將數據放到data文件夾下。
Labels.txt爲標籤名,一行一類;
train和test文件夾下都是類別標籤名爲文件名的樣本數據。
生成訓練樣本list
進入到path->cifar根目錄下,使用以下命令生成train和test的訓練所需的list文件。
cd cifar
find `pwd`/train -name \*.png > train.list
find `pwd`/test -name \*.png > test.list
如果你是jpg格式的則使用以下命令:
find `pwd`/train -name \*.png > train.list
find `pwd`/test -name \*.png > test.list
在使用以下命令進入到darknet框架的根目錄;
cd ../..
製作數據配置文件
在cfg/目錄下創建一個名爲cifar.data的文件,文件內容如下:
classes=10//類別數目
train = data/cifar/train.list///訓練數據路徑
valid = data/cifar/test.list///測試數據路徑
labels = data/cifar/labels.txt///訓練標籤文件路徑
backup = backup/ ///模型保存路徑
top=2 //輸出排名前2類的準確率
製作網絡配置文件
我們需要一個網絡來訓練,在cfg/文件夾下創建一個名爲cifar_small.cfg的文件夾,cifar_small.cfg文件如下:
[net]
batch=128
subdivisions=1
height=28
width=28
channels=3
max_crop=32
min_crop=32
hue=.1
saturation=.75
exposure=.75
learning_rate=0.1
policy=poly
power=4
max_batches = 5000
momentum=0.9
decay=0.0005
[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=16
size=1
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=32
size=1
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky
[convolutional]
filters=10
size=1
stride=1
pad=1
activation=leaky
[avgpool]
[softmax]
這是一個很小的網絡,因此他的性能不一定很好,但這是一個很好的例子。網絡僅僅只有4個卷積層和兩個池化層。
最後的卷積層有10個filter,因爲我們要分10類,輸出的大小爲7*7*10,我們總共需要十個預測,因此我們使用一個平均池化層來平均圖像的每一個通道,最後會給出10個預測,我們使用softmax激活函數使預測結果轉化爲一個概率分佈。
訓練模型
使用以下命令進行訓練(基於cifar網絡):
./darknet classifier train cfg/cifar.data cfg/cifar_small.cfg
使用cifar.data文件的數據配置以及cifar_small.cfg文件的網絡配置來訓練一個分類器。即使這是一個很小的網絡,在CPU上訓練也將花很長的時間,因此我們推薦使用GPU訓練。
基於darknet19網絡訓練命令:
./darknet classifier train cfg/cifar.data cfg/darknet19.cfg
從checkpoint開始訓練
如果你停止訓練,你仍然可以通過模型訓練的其中一個checkpoint重新開始。
./darknet classifier train cfg/cifar.data cfg/cifar_small.cfg backup/cifar_N.weights
模型驗證
我們可以使用保存的模型文件來驗證其可靠性,使用final weight file或者任何一個保存的迭代文件。
./darknet classifier valid cfg/cifar.data cfg/cifar_small.cfg backup/cifar_small.backup
遇到的問題
在基於分類模型的訓練中,使用預訓練模型的命令不知道是什麼,試了幾次都失敗,還沒開始訓練就直接結束了。