欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

caffe学习笔记(一): caffe训练流程(超详细)

程序员文章站 2022-05-30 21:30:41
...

一、准备数据

1.得到文件列表清单

         caffe学习笔记(一): caffe训练流程(超详细)        caffe学习笔记(一): caffe训练流程(超详细)       caffe学习笔记(一): caffe训练流程(超详细)

2.转换成Lmdb格式

在caffe中经常使用的数据类型是lmdb或leveldb,因此需要将原始图片文件转化为能够运行的db文件。在caffe中存在convert_imageset.cpp,存放在根目录下的tools文件夹下。编译之后,生成对应的可执行文件放在 buile/tools/ 下面,这个文件的作用就是用于将图片文件转换成caffe框架中能直接使用的db文件。

caffe学习笔记(一): caffe训练流程(超详细)

命令调用格式:

convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME

需要带四个参数:

FLAGS: 图片参数组,后面详细介绍

ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始

LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片

DB_NAME: 最终生成的db文件存放目录

完整流程如下:

首先创建sh脚本文件

sudo gedit examples/images/create_lmdb.sh

输入下面代码并保存

#!/usr/bin/en sh
DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
/home/xxx/caffe/examples/images/ $DATA/train.txt  $DATA/img_train_lmdb

设置参数-shuffle,打乱图片顺序。设置参数-resize_height和-resize_width将所有图片尺寸都变为256*256.

/home/xxx/caffe/examples/images/ 为图片保存的绝对路径。

最后,运行这个脚本文件

sudo sh examples/images/create_lmdb.sh

就会在examples/images/ 目录下生成一个名为 img_train_lmdb的文件夹,里面的文件就是我们需要的db文件了。

3.计算图片数据的均值

图片减去均值后,再进行训练和测试,会提高速度和精度。因此,一般在各种模型中都会有这个操作。

caffe中使用的均值数据格式是binaryproto。  caffe提供了一个计算均值的文件compute_image_mean.cpp,放在caffe根目录下的tools文件夹里面。编译后的可执行文件放在 build/tools/ 下面,直接调用即可。

sudo build/tools/compute_image_mean examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto

带两个参数:

第一个参数:examples/mnist/mnist_train_lmdb, 表示需要计算均值的数据,格式为lmdb的训练数据。

第二个参数:examples/mnist/mean.binaryproto, 计算出来的结果保存文件。

二、构建网络模型

要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个屋(layer)构成,每一屋又由许多参数组成。所有的参数都定义在caffe.proto这个文件中。要熟练使用caffe,最重要的就是学会配置文件(prototxt)的编写。

层有很多种类型,比如Data,Convolution,Pooling等,层之间的数据流动是以Blobs的方式进行。

以LeNet为例进行说明

<span style="font-size:18px;">name: "LeNet"
layer {
  name: "mnist"    // name制定层的名称,不能有重复
  type: "Data"   // type指定层的类型
  top: "data"
  top: "label"
  include {                //include用于指定是训练阶段还是测试阶段
    phase: TRAIN   //  训练阶段
  }
  transform_param {         //数据装换参数:
    scale: 0.00390625   //对所有的图片归一化到0~1之间,也就是对输入数据全部乘以scale,0.0039= 1/256    //缩放
  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"  //lmdb数据来源
    batch_size: 64    //批处理尺寸,每次训练采用的图片64张,min-batch
    backend: LMDB    //数据源格式
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST      //测试阶段
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_test_lmdb" //测试数据图片路径
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "conv1"   //卷积神经网络的第一层,卷积层
  type: "Convolution"  //这层操作为卷积
  bottom: "data"   //这一层的前一层是data层
  top: "conv1"   //
  param {
    lr_mult: 1    //第一个表示权值学习率
  }
  param {
    lr_mult: 2    //偏置项学习率
  }
  convolution_param {
    num_output: 20    //定义输出特征图个数
    kernel_size: 5    //定义卷积核(过滤器)大小
    stride: 1         //指定滑动步长S
    weight_filler {   //权值初始化为xavier
      type: "xavier"
    }
    bias_filler {     //初始化偏置项为常数0
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"      //池化层,这一层的操作为池化
  bottom: "conv1"     //这一层的前面一层名字为:conv1
  top: "pool1"
  pooling_param {
    pool: MAX        //采用最大值池化
    kernel_size: 2   
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"          //全连接层
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu1"   //**层
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "accuracy"    //输出分类精确度
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"          //Loss层,输出残差
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}</span>

三、编写配置文件

solver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一个参数就是solver配置文件。

实例如下:

net: "examples/mnist/lenet_train_test.prototxt"  //指定网络结构文件
test_iter: 100               //验证迭代次数
test_interval: 500        //验证间隔
base_lr: 0.01            //基础学习率
momentum: 0.9              //动量
type: SGD                  //solver优化方法
weight_decay: 0.0005       //权值衰减系数
lr_policy: "inv"         // 学习率变化规则
gamma: 0.0001              //学习率变化系数
power: 0.75              //学习率变化系数
display: 100              //屏幕显示间隔
max_iter: 20000             //最大迭代次数
snapshot: 5000              //快照,即Model保存间隔
snapshot_prefix: "examples/mnist/lenet"   //Model名字前缀
solver_mode: CPU         //硬件配置

注意:以上的所有参数都是可选参数,都有默认值。根据solver方法(type)的不同,还有一些其它的参数,在此不一一列举。 

四、训练模型

caffe学习笔记(一): caffe训练流程(超详细)

caffe的运行提供三种接口:c++接口(命令行)、python接口和matlab接口。

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

caffe程序的命令行执行格式如下:

caffe <command> <args>

 

其中的<command>有这样4种

 

train----训练或finetune模型(model),

test-----测试模型

device_query---显示gpu信息

time-----显示程序执行时间

其中的<args>参数有:

  • -solver              必须 ,训练配置文件
  • -gpu                 可选,指定某块GPU
  • -snapshot        可选,从快照中恢复训练
  • -weights            可选,预训练好的caffemodel
  • -iteration            可选,迭代次数
  • -model               可选,网络结构
  • -sighup_effect     意外中止时的操作
  • -sigint_effect       人工中止时的操作

 例如:

caffe学习笔记(一): caffe训练流程(超详细)

 五、测试模型

caffe学习笔记(一): caffe训练流程(超详细)

 

 

相关标签: caffe