caffe跑SENet框架

最近在研究SENet的论文框架,顺便记录下在caffe下添加层和方法。在SENet论文给出的github上的代码只有几个model的定义和模型,还有给了axpy层的实现,因此,要将SENet的代码跑起来,主要分为两步。

1、构建训练的solver.prototxt和train_val.prototxt文件

1、solver.prototxt文件
该文件是训练的时候需要用到的文件之一,主要是指定一些训练的超参数,以及网络net的定义。以下是自己根据以前VGG之类的写的一个solver.prototxt文件:

net: "models/SENet/models/SENet_ResNet50/train_resnet50.prototxt"  
test_iter: 100  
test_interval: 250  
base_lr: 0.0001  
lr_policy: "step"  
gamma: 0.1  
stepsize: 2500  
display: 20  
max_iter: 5000  
momentum: 0.9  
weight_decay: 0.0005  
snapshot: 1000  
snapshot_prefix: "models/SENet/models/SENet_ResNet50/caffe_senet_train"  
solver_mode: GPU  

注意:第一行指定的是相对于caffe的根目录的train_resnet50.prototxt文件的路径,也就是上面说的train_val文件。
2、train_val.prototxt文件
该文件指定了在训练和测试的时候网络的结构。以下是github上给出的基于ResNet50的model文件里的SE-ResNet-50.prototxt文件的开始和结束:
caffe跑SENet框架_第1张图片
以及结束的位置如下:
caffe跑SENet框架_第2张图片
注意:这里的SE-ResNet50的prototxt文件只能做预测用,不能用于训练,只能用于预测,要能用于训练在此基础上修改数据的输入层,以及再最后添加loss层即可。自己修改后的可以用于训练的train_val.prototxt文件如下:

layer {  
  name: "data"  
  type: "Data"  
  top: "data"  
  top: "label"  
  include {  
    phase: TRAIN  
  }  
  # transform_param {  
  #   mirror: true  
  #   crop_size: 224  
  #   mean_file: "data/ilsvrc12_shrt_256/imagenet_mean.binaryproto"  
  # }  
  transform_param {  
    mirror: true  
    crop_size: 224  
    mean_file: "models/SENet/data/mean.binaryproto"  
    #mean_value: 116.779  
    #mean_value: 123.68  
  }  
  data_param {  
    source: "models/SENet/data/img_train_lmdb"  
    batch_size: 8  
    backend: LMDB
  }  
}  
layer {  
  name: "data"  
  type: "Data"  
  top: "data"  
  top: "label"  
  include {  
    phase: TEST  
  }  
  # transform_param {  
  #   mirror: false  
  #   crop_size: 224  
  #   mean_file: "data/ilsvrc12_shrt_256/imagenet_mean.binaryproto"  
  # }  
  transform_param {  
    mirror: false  
    crop_size: 224  
    mean_file: "models/SENet/data/mean.binaryproto"  
    #mean_value: 116.779  
    #mean_value: 123.68  
  }  
  data_param {  
    source: "models/SENet/data/img_val_lmdb"  
    batch_size: 8  
    backend: LMDB
  }  
}  
layer {
  name: "conv1/7x7_s2"
  type: "Convolution"
  bottom: "data"
  top: "conv1/7x7_s2"
  convolution_param {
    num_output: 64
    bias_term: false
    pad: 3
    kernel_size: 7
    stride: 2
  }
}
........................
........................
layer {
  name: "pool5/7x7_s1"
  type: "Pooling"
  bottom: "conv5_3"
  top: "pool5/7x7_s1"
  pooling_param {
    pool: AVE
    kernel_size: 7
    stride: 1
  }
}
layer {
  name: "classifier0"   #为了节约时间是在已有的caffemodel上微调,因此需要改这层的名字,不然会出错
  type: "InnerProduct"
  bottom: "pool5/7x7_s1"
  top: "classifier0"
  inner_product_param {
    num_output: 2   #这里修改成自己需要用于分类的类别数
  }
}
## 添加一个精度层
layer {  
  name: "accuracy_at_1"  
  type: "Accuracy"  
  bottom: "classifier0"  
  bottom: "label"  
  top: "accuracy_at_1"  
  accuracy_param {  
    top_k: 1  
  }  
  include {  
    phase: TEST  
  }  
}  
## 添加一个精度层
layer {  
  name: "accuracy_at_5"  
  type: "Accuracy"  
  bottom: "classifier0"  
  bottom: "label"  
  top: "accuracy_at_5"  
  accuracy_param {  
    top_k: 2  
  }  
  include {  
    phase: TEST  
  }  
}  
# 吧最后一个层改成SoftmaxWithLoss层用于训练,之前只是一个分类层
layer {  
  bottom: "classifier0"  
  bottom: "label"  
  top: "loss"  
  name: "loss"  
  type: "SoftmaxWithLoss"  
}  



2、构建训练的sh文件如下:

#!/usr/bin/env sh
set -e

./build/tools/caffe train \
    --solver=models/SENet/models/SENet_ResNet50/solver_resnet50.prototxt \
    --weights=models/SENet/models/SENet_ResNet50/SE-ResNet-50.caffemodel $@

在训练的sh文件中,主要指定solver文件的路径,以及weight的权值参数的文件路径即可。

3、caffe中添加并编译axpy层:

在caffe中添加一个层,主要分为以下两步骤:编写hpp、cpp以及cu文件并放到caffe对应的文件夹中,并修改caffe.proto文件;重新编译caffe,指令:
- make -j 32
1、重新编写层文件
在github上可以下载到对应的axpy层的文件,并放到对应的caffe的文件夹的目录就可以了。在caffe中新添加一个层,主要需要编写hpp文件,放在caffe/include/caffe/layers文件夹下,编写cpp、cu文件放在caffe/src/caffe/layers文件夹下,即可。
2、修改caffe.proto文件
因为新添加了层,需要在caffe/src/caffe/proto/caffe.proto文件中的 message LayerParameter中为新层添加参数,即使新层没有参数,也需要在message LayerParameter中为新曾添加参数,这样是为了告诉caffe现在新添加了一个层。这里添加的时候需要注意ID不能重复,在后面为新参数添加也要添加一个消息,如果有参数就需要在里面写参数,没有就定义一个空的message即可。本次修改的caffe.proto如下:
caffe跑SENet框架_第3张图片
3、重新编译caffe
退回到caffe的根目录,在根目录下重新编译caffe。编译的指令如下:
make -j 32

你可能感兴趣的:(深度学习,caffe学习笔记)