1. 程式人生 > >深度學習(七十)darknet 實現編寫mobilenet原始碼

深度學習(七十)darknet 實現編寫mobilenet原始碼

一、新增一個新的網路層

(1)parse.c檔案中函式string_to_layer_type,新增網路層型別解析:

if (strcmp(type, "[depthwise_convolutional]") == 0) return DEPTHWISE_CONVOLUTIONAL;

(2)darknet.h檔案中列舉型別LAYER_TYPE新增網路層列舉型別:

DEPTHWISE_CONVOLUTIONAL;

(3)parse.c檔案中函式parse_network_cfg新增網路層解析後進行構建:

        LAYER_TYPE lt = string_to_layer_type(s->type);
if (lt == DEPTHWISE_CONVOLUTIONAL) {
l = parse_depthwise_convolutional(options, params);//自己編寫的函式,主要呼叫了make layer
}
        else if(lt == CONVOLUTIONAL){
            l = parse_convolutional(options, params);

(4)parse.c 新增引數讀取網路層載入檔案

A、新增網路層讀取引數函式

void load_weights_upto(network *net, char *filename, int start, int cutoff)
load depthwise weights;

B、把引數讀取到記憶體上:

void load_depthwise_convolutional_weights(layer l, FILE *fp);

C、以及修改depthwise_convolutional_kenel.cu把讀取後的cpu引數拷貝到視訊記憶體上:

void push_depthwise_convolutional_layer(depthwise_convolutional_layer layer);

(5)parse.c新增引數儲存功能:

void save_weights_upto(network net, char *filename, int cutoff):
void save_depthwise_convolutional_weights(layer l, FILE *fp);
void pull_depthwise_convolutional_layer(depthwise_convolutional_layer layer);

(6)新增network.c中網路層:

int resize_network(network *net, int w, int h)的resize:
if (l.type==DEPTHWISE_CONVOLUTIONAL)
{
resize_depthwise_convolutional_layer(&l, w, h);
}

(7)另外在多卡非同步訓練的時候,network_kernels.cu的好幾個函式也要新增depth_convolutional引數相關的更新設定。

總結為一句話:直接搜尋專案中呼叫:CONVOLUTIONAL的關鍵子

有呼叫到卷積層列舉型別的地方,可分離卷積層也要新增相對應的功能。

(8)darknet使用須知:darknet的網路配置檔案中的學習率、batch並不是我們平時所說的學習率、batch_size。網路更新所用的學習率為:learning_rate/batch_size,所以學習率不能太小,比如如果學習率設定為0.01,batch=128,那麼實際計算的學習率就是0.000078,非常小的一個數值,基本上就是更新不了

二、編寫網路層程式碼:depthwise_convolutional_kernels.cu、depthwise_convolutional_layer.c、depthwise_convolutional_layer.h

三、編寫mobilenet網路結構檔案:

[net]
batch=32
subdivisions=1
height=224
width=224
channels=3
momentum=0.9
decay=0.000
max_crop=320

learning_rate=0.1
policy=poly
power=3
max_batches=1600000

#conv1 
[convolutional]
batch_normalize=1
filters=32
size=3
stride=2
pad=1
activation=relu

#conv2_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv2_1/sep
[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=0
activation=relu


#conv2_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv2_2/sep
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=0
activation=relu

#conv3_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu


#conv3_1/sep
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=0
activation=relu

#conv3_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv3_2/sep
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=0
activation=relu

#conv4_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv4_1/sep
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=0
activation=relu

#conv4_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv4_2/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_1/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_1/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_2/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_2/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_3/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_3/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_4/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_4/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_5/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv5_5/sep
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=0
activation=relu

#conv5_6/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=2
pad=1
activation=relu

#conv5_6/sep
[convolutional]
batch_normalize=1
filters=1024
size=1
stride=1
pad=0
activation=relu

#conv6/dw
[depthwise_convolutional]
batch_normalize=1
size=3
stride=1
pad=1
activation=relu

#conv6/sep
[convolutional]
batch_normalize=1
filters=1024
size=1
stride=1
pad=0
activation=relu

#pool6
[avgpool]

#fc7
[convolutional]
filters=1000
size=1
stride=1
pad=0
activation=leaky

[softmax]
groups=1

[cost]
四、imagenet訓練實驗

1、訓練一天後,經過兩輪多的epoch後,精度:


2、訓練兩天後,迭代第二天結果:


3\又訓練了一天多: