caffe ssd 杂记

目录

prototxt文件solver.prototxt

train.prototxt

deploy.prototxt

caffe下各层概念(主要层)

Convolution卷积层

4Pooling层

全连接层

caffe命令行解析

train指令

test指令

time指令


prototxt文件
solver.prototxt

train_net: "models/VGGNet/SSD_FT_300x300/0107/train.prototxt"
test_net: "models/VGGNet/SSD_FT_300x300/0107/test.prototxt"
test_iter: 619 # specifies how many forward passes the test should carry out.
test_interval: 5000  #训练每迭代5000次,进行一次预测
base_lr: 0.0005
display: 10  #每经过10次迭代,在屏幕上打印一次log
max_iter: 240000 #最大迭代次数
lr_policy: "multistep" #采用的学习策略
gamma: 0.1
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000  #每10000次迭代打印一次快照
snapshot_prefix: "ssd_models/VGGNet/SSD_FT_300x300/0107/VGG_VOC0712_SSD_FT_300x300"#保存路径
solver_mode: GPU
device_id: 0
debug_info: false
snapshot_after_train: true
test_initialization: false
average_loss: 10
stepvalue: 160000
stepvalue: 200000
stepvalue: 240000
iter_size: 1
type: "SGD"
eval_type: "detection"
ap_version: "11point"
show_per_class_result: true

这个文件告诉了我们训练的网络和超参数。用caffe训练时会首先读取该文件,获得其中特定字段的数值,并据此设置内存中模型训练时的超参数变量值。solver.prototxt的主要作用就是交替调用前向算法和后向算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。  

train.prototxt

这个文件是网络配置文件,给出了网络的具体定义。

name: "VGG_VOC0712_SSD_FT_300x300_train"
layer {
  name: "data"          #输入层的名称
  type: "AnnotatedData" #输入层的类型
  top: "data"
  top: "label" #层的输出blob有两个:data和label
  include {
    phase: TRAIN #训练阶段,该层参数只在训练阶段有效
  }
  transform_param {
    mirror: true #镜像操作
    mean_value: 104
    mean_value: 117
    mean_value: 123
......
  }
  data_param {
    source: "examples/VOC0712/VOC0712_trainval_lmdb" #输入数据路径
    batch_size: 16           #batch
    backend: LMDB           #数据格式为LMDB
  }
......
}
layer {
  name: "conv1_1"
  type: "Convolution"
  bottom: "data"
  top: "conv1_1"
  param {
# 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult
# , 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。
# 这里是权值学习率
    lr_mult: 1
# 权值衰减,防止过拟合
    decay_mult: 1
  }
  param {
# 这里是偏置项的学习率,偏置项一般不存在过拟合的问题
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
# 卷积核的个数
    num_output: 64
    pad: 1
# 卷积核的大小,如果卷积核不是正方形的,可以使用kernel_h和kernel_w分别设定
    kernel_size: 3
# 卷积核的步长stride,默认为1
# 权值初始化
    weight_filler {
      type: "xavier"
    }
# 偏置项的初始化
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
# Relu层
layer {
  name: "relu1_1"
  type: "ReLU"
  bottom: "conv1_1"
  top: "conv1_1"
}
......
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1_2"
  top: "pool1"
  pooling_param {
# pooling类型,默认值为MAX,也可以设置为AVE,STOCHASTIC
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}

常见的层的类型:

卷积层:Convolution
数据层:Data
池化层:Pooling
ReLU层:Relu
Dropout层:Dropout
全连接层:InnerProduct
局部相应归一化层:lrn_param
SoftMax层:SoftmaxWithLoss
Accuracy层:Accuracy
也可自己定义层

deploy.prototxt

测试时用的文件。

xxx.caffemodel vs xxx.solversate

train.prototxt与deploy.prototxt的区别,参看:https://blog.csdn.net/fx409494616/article/details/53008971

caffemodel文件保存了最终训练的模型权值,solversate保存了训练状态。

 

caffe下各层概念(主要层)

Convolution卷积层

lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。

num_output: 卷积核(filter)的个数

kernel_size: 卷积核的大小。如果卷积核的长和宽不等,需要用kernel_h和kernel_w分别设定

stride: 卷积核的步长,默认为1。也可以用stride_h和stride_w来设置。

pad: 扩充边缘,默认为0,不扩充。 扩充的时候是左右、上下对称的,比如卷积核的大小为5*5,那么pad设置为2,则四个边缘都扩充2个像素,即宽度和高度都扩充了4个像素,这样卷积运算之后的特征图就不会变小。也可以通过pad_h和pad_w来分别设定。

weight_filler: 权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"

bias_filler: 偏置项的初始化。一般设置为"constant",值全为0。

group: 分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。如果我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。

FLOPS的计算:输入规模(上层输出边长乘积)*(kernel_size^2+bias_filler)*num_output(这里pad=0)

4Pooling层

也叫池化层,为了减少运算量和数据维度而设置的一种层。

层类型:Pooling

必须设置的参数:

     kernel_size: 池化的核大小。也可以用kernel_h和kernel_w分别设定。

其它参数:

pool: 池化方法,默认为MAX。目前可用的方法有MAX, AVE, 或STOCHASTIC

    pad: 和卷积层的pad的一样,进行边缘扩充。默认为0

     stride: 池化的步长,默认为1。一般我们设置为2,即不重叠。也可以用stride_h和stride_w来设置。

FLOPS的计算:(kernel_size^2+1)*num_output*输出规模(下层输入边长乘积)

全连接层

实际上,全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1。

FLOPS的计算:(kernel_size^2+1)*num_output*输出规模(下层输入边长乘积) 
参考:https://blog.csdn.net/a554142589/article/details/81184172

 

caffe命令行解析

参考:https://www.cnblogs.com/denny402/p/5076285.html (有空看一下这个系列博客)

caffe的运行提供三种接口:c++接口(命令行)、python接口和matlab接口。本文先对命令行进行解析,后续会依次介绍其它两个接口。

caffe的c++主程序(caffe.cpp)放在根目录下的tools文件夹内, 当然还有一些其它的功能文件,如:convert_imageset.cpp, train_net.cpp, test_net.cpp等也放在这个文件夹内。经过编译后,这些文件都被编译成了可执行文件,放在了 ./build/tools/ 文件夹内。因此我们要执行caffe程序,都需要加 ./build/tools/ 前缀。

./build/tools/caffe <command> <args>

其中的<command>有这样四种:

  • train----训练或finetune模型(model),
  • test-----测试模型
  • device_query---显示gpu信息
./build/tools/caffe device_query -gpu 0
  • time-----显示程序执行时间

train指令

  • -solver              必选参数,模型的配置文件
./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt
  • -gpu                  指定用哪一块gpu运行,根据gpu的id进行选择,如果设置为'-gpu all'则使用所有的gpu运行。
./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -gpu 2
  • -snapshot         从快照(snapshot)中恢复训练。可以在solver配置文件设置快照,保存solverstate。
./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -snapshot examples/mnist/lenet_iter_5000.solverstate
  • -weights           预先训练好的权重来fine-tuning模型,需要一个caffemodel,不能和-snapshot同时使用。
./build/tools/caffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel
  • -iteration           迭代次数,默认为50。 如果在配置文件文件中没有设定迭代次数,则默认迭代50次。
  • -model              定义在protocol buffer文件中的模型。也可以在solver配置文件中指定。
  • -sighup_effect   用来设定当程序发生挂起事件时,执行的操作,可以设置为snapshot, stop或none, 默认为snapshot
  • -sigint_effect   用来设定当程序发生键盘中止事件时(ctrl+c), 执行的操作,可以设置为snapshot, stop或none, 默认为stop

test指令

利用训练好了的权重(-weight),输入到测试模型中(-model),用编号为0的gpu(-gpu)测试100次(-iteration)。

./build/tools/caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100

time指令

在屏幕上显示lenet模型迭代10次所使用的时间。包括每次迭代的forward和backward所用的时间,也包括每层forward和backward所用的平均时间。

./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -iterations 10

在屏幕上显示lenet模型用gpu迭代50次所使用的时间。

./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 10

利用给定的权重,利用第一块gpu,迭代10次lenet模型所用的时间。

./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 10

报错信息

 

https://blog.csdn.net/xunan003/article/details/78429189

https://blog.csdn.net/u012841667/article/details/53316948

https://www.cnblogs.com/xiangfeidemengzhu/p/7058391.html

https://blog.csdn.net/hjxu2016/article/details/83866827

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