利用caffe訓練網路的步驟
阿新 • • 發佈:2019-01-21
0:將圖片設定好標號(從0開始的連續自然數)
1:首先需要將圖片轉換成需要的資料格式
#!/usr/bin/env sh # Create the imagenet lmdb inputs # N.B. set the path to the imagenet train + val data dirs # EXAMPLE=examples/imagenet # DATA=data/ilsvrc12 TOOLS=build/tools # TRAIN_DATA_ROOT=/path/to/imagenet/train/ # VAL_DATA_ROOT=/path/to/imagenet/val/ TRAIN_DATA_ROOT=/examples/jb/train/ VAL_DATA_ROOT=/examples/jb//val/ LABEL_ROOT=/examples/jb SAVE_DATA_ROOT=/examples/jb/data # Set RESIZE=true to resize the images to 256x256. Leave as false if images have # already been resized using another tool. # RESIZE=false RESIZE=true if $RESIZE; then RESIZE_HEIGHT=32 RESIZE_WIDTH=32 else RESIZE_HEIGHT=0 RESIZE_WIDTH=0 fi if [ ! -d "$TRAIN_DATA_ROOT" ]; then echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT" echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \ "where the ImageNet training data is stored." exit 1 fi if [ ! -d "$VAL_DATA_ROOT" ]; then echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT" echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \ "where the ImageNet validation data is stored." exit 1 fi echo "Creating train lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ --resize_width=$RESIZE_WIDTH \ --shuffle \ $TRAIN_DATA_ROOT \ $LABEL_ROOT/train.txt \ $SAVE_DATA_ROOT/train_lmdb echo "Creating val lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ --resize_width=$RESIZE_WIDTH \ --shuffle \ $VAL_DATA_ROOT \ $LABEL_ROOT/val.txt \ $SAVE_DATA_ROOT/val_lmdb echo "Done."
2:計算訓練樣本的均值(彩色圖時需要)
#!/usr/bin/env sh
# Compute the mean image from the imagenet training leveldb
# N.B. this is available in data/ilsvrc12
./build/tools/compute_image_mean examples/jb/data/train_lmdb \
examples/jb/data/image_mean.binaryproto
echo "Done."
3:定義好網路的結構
name: "AlexNet" layers { name: "data" type: DATA top: "data" top: "label" data_param { source: "examples/jb/data/train_lmdb" backend: LMDB batch_size: 256 } transform_param { crop_size: 227 mean_file: "examples/jb/data/image_mean.binaryproto" mirror: true } include: { phase: TRAIN } } layers { name: "data" type: DATA top: "data" top: "label" data_param { source: "examples/jb/data/val_lmdb" backend: LMDB batch_size: 50 } transform_param { crop_size: 227 mean_file: "examples/jb/data/image_mean.binaryproto" mirror: false } include: { phase: TEST } } layers { name: "conv1" type: CONVOLUTION bottom: "data" top: "conv1" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0 convolution_param { num_output: 64 kernel_size: 5 stride: 1 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0 } } } layers { name: "relu1" type: RELU bottom: "conv1" top: "conv1" } layers { name: "norm1" type: LRN bottom: "conv1" top: "norm1" lrn_param { local_size: 9 alpha: 0.0001 beta: 0.75 } } layers { name: "pool1" type: POOLING bottom: "norm1" top: "pool1" pooling_param { pool: MAX kernel_size: 3 stride: 2 } } layers { name: "conv2" type: CONVOLUTION bottom: "pool1" top: "conv2" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0 convolution_param { num_output: 64 pad: 2 kernel_size: 5 group: 2 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0.1 } } } layers { name: "relu2" type: RELU bottom: "conv2" top: "conv2" } layers { name: "norm2" type: LRN bottom: "conv2" top: "norm2" lrn_param { local_size: 9 alpha: 0.0001 beta: 0.75 } } layers { name: "pool2" type: POOLING bottom: "norm2" top: "pool2" pooling_param { pool: MAX kernel_size: 3 stride: 2 } } layers { name: "conv3" type: CONVOLUTION bottom: "pool2" top: "conv3" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0 convolution_param { num_output: 64 pad: 1 kernel_size: 3 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0 } } } layers { name: "relu3" type: RELU bottom: "conv3" top: "conv3" } layers { name: "conv4" type: CONVOLUTION bottom: "conv3" top: "conv4" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0 convolution_param { num_output: 32 pad: 1 kernel_size: 3 group: 2 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0.1 } } } layers { name: "relu4" type: RELU bottom: "conv4" top: "conv4" } layers { name: "fc6" type: INNER_PRODUCT bottom: "conv4" top: "fc6" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0 inner_product_param { num_output: 43 weight_filler { type: "gaussian" std: 0.005 } bias_filler { type: "constant" value: 0.1 } } } layers { name: "relu6" type: RELU bottom: "fc6" top: "fc6" } layers { name: "accuracy" type: ACCURACY bottom: "fc6" bottom: "label" top: "accuracy" include: { phase: TEST } } layers { name: "loss" type: SOFTMAX_LOSS bottom: "fc6" bottom: "label" top: "loss" }
4:定義好sover檔案
net: "examples/jb/train_val.prototxt"
test_iter: 1000
test_interval: 1000
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "examples/jb/models/caffe_alexnet_train"
solver_mode: GPU
5:訓練網路
#!/usr/bin/env sh echo "begin to train the net!" ./build/tools/caffe train \ --solver=examples/jb/solver.prototxt echo "the net is finish"
這樣就完成了網路的整個訓練過程,之後可以利用這個模型進行測試。