您的位置  > 互联网

基于命令行的模型训练:LeNet模型PS

1.caffe是一个清晰高效的深度学习框架,纯C++/CUDA架构,支持命令行和接口,可以在CPU和GPU之间直接无缝切换;

2.caffe的主要优点:

(1)CPU和GPU无缝切换;

(2) 模型和优化通过配置文件设置,无需代码;

3.下载并安装caffe:

(一)下载

(2) 安装

(3)caffe的下载和安装以及一些基本介绍在官网上已经有详细介绍,这里不再重复;

4、使用caffe的界面是命令行。 我个人认为训练模型时使用命令行就足够简单了。 对于训练好的模型,可以使用caffe的接口来调用。 本文首先介绍基于命令行的模型训练,然后以LeNet模型为例;

(2)LeNet模型

PS:LeNet是应用在手写数字数据库MNIST上的经典模型。 它有7层网络结构,分别是卷积层-下采样层-卷积层-下采样层-全连接层-全连接层-分类层。 具体网络详情请参考文章。 :

基于

1、安装编译caffe后,主目录包含:

2. 在训练模型之前,需要准备训练数据MNIST。 执行以下命令下载 MNIST 数据库:

3、由于caffe支持的数据类型不包括图像类型,所以常规做法需要将图像类型转换为lmdb类型:

4. 准备好数据后,我们需要定义我们的网络模型。 在caffe中,它是通过.文件定义的。 执行以下命令:

您可以看到每个网络层是如何定义的:

(1) 输入层(数据层):

[清楚的]

layer{name:"mnist"//表示图层名称 type:"Data"//表示图层类型 top:"data"top:"label"{phase:TRAIN//表示仅在训练中起作用Phase}{scale: 0.//归一化图像像素值}{:"/mnist/"//数据源:64//训练时每次迭代的输入样本数:LMDB//数据类型}}

layer {
  name: "mnist"      //表示层名
  type: "Data"       //表示层的类型
  top: "data"        
  top: "label"
  include {
    phase: TRAIN      //表示仅在训练阶段起作用
  }
  transform_param {
    scale: 0.00390625  //将图像像素值归一化
  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"   //数据来源
    batch_size: 64                              //训练时每个迭代的输入样本数量
    backend: LMDB                               //数据类型
  }
}

(2)卷积层:

[清楚的]

layer{name:"conv1"type:"":"data"//输入为:"conv1"//输出为卷积特征 param{:1//权重参数w的学习率倍数}param{ :2//偏置参数b的学习率倍数}{:::{//权重参数w的初始化方案,使用算法 type:""}{type:""//偏移参数b初始化为常量,通常0}}}

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"               //输入是data
  top: "conv1"                 //输出是卷积特征
  param {
    lr_mult: 1                 //权重参数w的学习率倍数
  }
  param {
    lr_mult: 2                 //偏置参数b的学习率倍数
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {           //权重参数w的初始化方案,使用xavier算法
      type: "xavier"
    }
    bias_filler {
      type: "constant"       //偏置参数b初始化化为常数,一般为0
    }
  }
}

(3) 下采样层(池):

[清楚的]

层{名称:“pool1”类型:“”:“conv1”顶部:“pool1”{pool:::2}}

layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}

(4)全连接层:

[清楚的]

层{name:"ip1"类型:"":"pool2"top:"ip1"param{:1}param{:2}{:{type:""}{type:""}}}

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"
    }
  }
}

(5)非线性层:

[清楚的]

层{名称:“relu1”类型:“ReLU”:“ip1”顶部:“ip1”}

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}

(6)精度层(计算精度):

[清楚的]

层{名称:“”类型:“”:“ip2”:“标签”顶部:“”{阶段:测试}}

layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}

(7)损失估计层:

[清楚的]

层{名称:“损失”类型:“”:“ip2”:“标签”顶部:“损失”}

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

5、定义好网络模型后,还需要配置模型优化的文件:

配置文件如下:

[清楚的]

#/:"/mnist/."//设置网络模型配置文件路径#.#,ns,#,.:100#s.:500#,.:0.:0.:0.0005#:" inv "伽玛:0.:0.75#:100#:10000#::"/mnist/lenet"#::GPU

# The train/test net protocol buffer definition
net: "examples/mnist/lenet_train_test.prototxt"     //设定网络模型配置文件的路径
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500                             
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
# solver mode: CPU or GPU
solver_mode: GPU

6.下一步是训练。 直接执行命令即可:

执行后可以看到:首先会读取配置文件来初始化网络和优化器:

然后开始优化:

可以看到,在训练过程中,每100次迭代就会显示一次损失,每500次迭代就会计算一次测试精度,总共10000次迭代。 这些可以在配置文件中设置;

7. 训练后的模型保存在. 文件,可以被c等调用;

8.通过上一篇博文中LeNet模型的使用,我们可以发现使用caffe训练模型只需要以下步骤:

(1)准备数据;

(2)编写模型配置文件;

(3)编写优化配置文件;

(4) 命令行执行;

这样就可以得到训练好的model.file;

(3) 基于命令行的模型训练

1. 准备数据

(1)数据来源:任意jpg或其他格式的图片数据;

(2)将数据分为train和val数据集,并用文本记录对应的标签(自己写脚本即可),格式如下:

注意label是从0开始的;

(3) 将数据转换为lmdb。 在caffe的根目录/build/tools/下有各种可以使用的命令行任务。 为了将图像数据转换为lmdb,使用指令如下:

[清楚的]

$/\--=$\--=$\--\$\$/label.txt\$/

   $CAFFE_TOOLS/convert_imageset \
                --resize_height=$RESIZE_HEIGHT \
                --resize_width=$RESIZE_WIDTH \
                --shuffle \
                $IMAGE_DATA_ROOT \
                $LABEL_DATA_PATH/label.txt \
                $OUTPUT_PATH/data_lmdb

其中是命令行路径; 根据自己的需要决定是否对原图进行转换;

2.训练模型

我们已经描述了如何配置模型文件和优化文件。 现在我们需要关注如何调用命令行进行训练:

很简单,指定优化配置文件的路径即可;

至此,模型训练结束,我们得到了我们想要的模型,存储在.;

3. 使用模型

下面记录如何通过命令行使用训练好的模型,主要描述各层特征的提取:

(1)测试。 描述测试的网络结构;

(2) ip2代表需要提取特征的层的名称;

4、注意事项

(1)jpg数据转换为lmdb时,需要标签文本信息。 一般来说,train 和 data 有标签,但 test data 没有。 一般为测试数据提供索引文本信息;

(2)模型训练过程中,会导入train数据和val数据。 train数据用于训练模型,val数据给出识别率并为参数调整提供参考; val数据不是必需的,可以根据需要在训练模型配置文件中使用。 在定义中;

(3) 训练过程的模型文件同时定义了训练模型和验证模型,而特征提取过程的模型文件只定义了测试模型;

(4)提取的特征中,每幅图像的特征顺序与输入的顺序不同。 为了获得caffe中模型训练过程中输入图像的顺序,可以提取测试数据的索引文本信息,或者是标签信息;

(5)提取的特征以lmdb形式给出,需要根据需要进行转换;