1. Caffe训练方法综述

caffe非常简单,训练时只需写prototxt文件即可,其大致的步骤为:

  1. Resize图片,转换存储格式(LMDB/LevelDB)
  2. 定义网络结构(编辑prototxt)
  3. 定义solver(编辑另一个prototxt)
  4. 一行命令开始训练(可以基于已有的权重赋值)

如下图所示,其训练的过程,关于卷积神经网络(CNN)可以参考:计算机视觉与卷积神经网络

下面对手写数字识别进行训练。

2. MNIST数据集

mnist是一个大型的手写数字库,其包含60000个训练集和10000个测试机,每张图片已经进行了尺度归一化等操作,因此可以直接拿过来使用。

下载

可以在Caffe源码框架的/data/mnist下执行,如果没有安装Caffe,请参考:linux(ubuntu)下安装深度学习框架caffe

cd data/mnist
./get_mnist.sh

下载后可以看到其文件:

yqtao@yqtao:~/caffe/data/mnist$ tree
.
├── get_mnist.sh
├── t10k-images-idx3-ubyte
├── t10k-labels-idx1-ubyte
├── train-images-idx3-ubyte
└── train-labels-idx1-ubyte

注意:下载后的文件需要转换存储格式为LEVELDB或LMDB,这要做有两个原因:

  1. 转换成统一的格式可以简化数据读取层的实现
  2. 提高磁盘I/O的利用率

转换格式

// 执行命令
yqtao@yqtao:~/caffe$ ./examples/mnist/create_mnist.sh

这要会在example/mnist产生 mnist_test_lmdbmnist_train_lmdb两个目录分别存放测试集和训练集。

3. 定义层次结构

这是非常重要的一步,但是其完全是模板话的定义,如下图所示为LeNet-5模型所定义的CNN:

这张图非常的重要,有了它,编写后面的网络结构就好非常的清晰了。 关于上图的结构是写到.prototxt文件中的,其文件描述在 /example/mnist/lenet_train_val.prototxt中。

数据层

数据层的图示:

  1 name: "LeNet"                  //Net的名称2 layer {3   name: "mnist"4   type: "Data"                //表明为数据层5   top: "data"                 //top,表示输出6   top: "label"7   include {                   //只在训练时有效8     phase: TRAIN9   }10   transform_param {11     scale: 0.00390625        //数据变化缩放因子12   }13   data_param {               //数据层的参数14     source: "examples/mnist/mnist_train_lmdb" //来源15     batch_size: 64          //一次读取64张图片16     backend: LMDB           //数据格式17   }18 }

卷积层

卷积层的图示:

如下卷积层的定义:

 36 layer { 37 name: "conv1" 38 type: "Convolution" 39 bottom: "data" //上一层的输出,这一层的输入 40 top: "conv1" //这一层的输出 41 param { //学习率 42 lr_mult: 1 43 }44   param { 45 lr_mult: 2 46 }47   convolution_param { 48 num_output: 20 //也就是depth 49 kernel_size: 5 //核的大小5*5 50 stride: 1 //步长1 51 weight_filler { //权值初始方式 52 type: "xavier" 53 }54     bias_filler { 55 type: "constant" 56 }57   }58 }

注意:在top,和bottom中一定不要写错了!

池化层

池化层图示:

其定义如下:

 59 layer {60   name: "pool1"61   type: "Pooling"62   bottom: "conv1"63   top: "pool1"64   pooling_param {65     pool: MAX           //下采样的方法66     kernel_size: 2      //窗口67     stride: 2           //步长68   }69 }

全链接层

其定义如下:

104 layer { 105 name: "ip1" 106 type: "InnerProduct" 107 bottom: "pool2" 108 top: "ip1" 109 param { 110 lr_mult: 1 111 }
112   param { 113 lr_mult: 2 114 }
115   inner_product_param { 116 num_output: 500 117 weight_filler { 118 type: "xavier" 119 }
120     bias_filler { 121 type: "constant" 122 }
123   }
124 }

激励层

其图示如下:

定义如下:

125 layer { 126 name: "relu1" 127 type: "ReLU" 128 bottom: "ip1" 129 top: "ip1" 130 }

损失层

定义如下:

162 layer { 163 name: "loss" 164 type: "SoftmaxWithLoss" 165 bottom: "ip2" 166 bottom: "label" 167 top: "loss" 168 }

注意:计算损失的时候的输入为label为数据层的一个输出,和全连接层的输出ip2,这一层的输出为loss

4. 定义超参数文件

有了上面的网络结构的文件后还需要一个solver.prototxt的文件,其指定了训练的超参数。

其文件目录在example/mnist/lenet_solver.prototxt,每一项都有详细的解析。

  1 # The train/test net protocol buffer definition2 net: "examples/mnist/lenet_train_test.prototxt"3 # test_iter specifies how many forward passes the test should carry out.4 # In the case of MNIST, we have test batch size 100 and 100 test iterations,5 # covering the full 10,000 testing images.6 test_iter: 1007 # Carry out testing every 500 training iterations.8 test_interval: 5009 # The base learning rate, momentum and the weight decay of the network.10 base_lr: 0.0111 momentum: 0.912 weight_decay: 0.000513 # The learning rate policy14 lr_policy: "inv"15 gamma: 0.000116 power: 0.7517 # Display every 100 iterations18 display: 10019 # The maximum number of iterations20 max_iter: 1000021 # snapshot intermediate results22 snapshot: 500023 snapshot_prefix: "examples/mnist/lenet"24 # solver mode: CPU or GPU25 solver_mode: CPU

5. 训练

首先了解build/tools/caffe.bin的用法,如下所示:

yqtao@yqtao:~/caffe$ ./build/tools/caffe.bin
caffe.bin: command line brew
usage: caffe <command> <args>commands:train           train or finetune a modeltest            score a modeldevice_query    show GPU diagnostic informationtime            benchmark model execution timeFlags from tools/caffe.cpp:-gpu (Optional; run in GPU mode on given device IDs separated by ','.Use'-gpu all' to run on all available GPUs. The effective training batchsize is multiplied by the number of devices.) type: string default: ""-iterations (The number of iterations to run.) type: int32 default: 50-level (Optional; network level.) type: int32 default: 0-model (The model definition protocol buffer text file.) type: stringdefault: ""-phase (Optional; network phase (TRAIN or TEST). Only used for 'time'.)type: string default: ""-sighup_effect (Optional; action to take when a SIGHUP signal is received:snapshot, stop or none.) type: string default: "snapshot"-sigint_effect (Optional; action to take when a SIGINT signal is received:snapshot, stop or none.) type: string default: "stop"-snapshot (Optional; the snapshot solver state to resume training.)type: string default: ""-solver (The solver definition protocol buffer text file.) type: stringdefault: ""-stage (Optional; network stages (not to be confused with phase), separatedby ','.) type: string default: ""-weights (Optional; the pretrained weights to initialize finetuning,separated by ','. Cannot be set simultaneously with snapshot.)type: string default: ""

则进行训练的命令为:

//执行命令 ./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt

其中solver=examples/mnist/lenet_solver.prototxt为指定的超参数文件。

运行部分结果如下:

I0311 17:43:26.273123 16205 sgd_solver.cpp:106] Iteration 9900, lr = 0.00596843
I0311 17:43:34.746616 16205 solver.cpp:454] Snapshotting to binary proto file examples/mnist/lenet_iter_10000.caffemodel
I0311 17:43:34.758142 16205 sgd_solver.cpp:273] Snapshotting solver state to binary proto file examples/mnist/lenet_iter_10000.solverstate
I0311 17:43:34.799706 16205 solver.cpp:317] Iteration 10000, loss = 0.00373883
I0311 17:43:34.799777 16205 solver.cpp:337] Iteration 10000, Testing net (#0)
I0311 17:43:40.162556 16205 solver.cpp:404]     Test net output #0: accuracy = 0.9914
I0311 17:43:40.162638 16205 solver.cpp:404]     Test net output #1: loss = 0.0260208 (* 1 = 0.0260208 loss)
I0311 17:43:40.162645 16205 solver.cpp:322] Optimization Done.
I0311 17:43:40.162649 16205 caffe.cpp:254] Optimization Done.

可以看到,最终的训练模型的权值保存在 examples/mnist/lenet_iter_10000.caffemodel 训练的状态保存在 examples/mnist/lenet_iter_10000.solverstate

6. 验证

执行下面的命令,指定命令test,参数网络定义的位置和权值的位置即可。

yqtao@yqtao:~/caffe$ ./build/tools/caffe.bin test \
> -model examples/mnist/lenet_train_test.prototxt \
> -weights examples/mnist/lenet_iter_10000.caffemodel \
> -iterations 100

运行结果如下:

0311 17:49:28.120023 16423 caffe.cpp:308] Batch 96, accuracy = 0.97
I0311 17:49:28.120096 16423 caffe.cpp:308] Batch 96, loss = 0.0561079
I0311 17:49:28.174964 16423 caffe.cpp:308] Batch 97, accuracy = 0.98
I0311 17:49:28.175036 16423 caffe.cpp:308] Batch 97, loss = 0.0847761
I0311 17:49:28.229038 16423 caffe.cpp:308] Batch 98, accuracy = 1
I0311 17:49:28.229110 16423 caffe.cpp:308] Batch 98, loss = 0.00344597
I0311 17:49:28.286336 16423 caffe.cpp:308] Batch 99, accuracy = 1
I0311 17:49:28.286495 16423 caffe.cpp:308] Batch 99, loss = 0.00835868
I0311 17:49:28.286504 16423 caffe.cpp:313] Loss: 0.0260208
I0311 17:49:28.286516 16423 caffe.cpp:325] accuracy = 0.9914
I0311 17:49:28.286526 16423 caffe.cpp:325] loss = 0.0260208 (* 1 = 0.0260208 loss)

最终的精确度为accuracy = 0.9914.

7. 总结

  1. 转换存储格式(LMDB/LevelDB)

  2. 定义网络结构(编辑prototxt

  3. 定义solver(编辑另一个prototxt

  4. 学习使用caffe.bin命令的使用

Caffe学习-手写数字识别相关推荐

  1. Caffe MNIST 手写数字识别(全面流程)

    目录 1.下载MNIST数据集 2.生成MNIST图片训练.验证.测试数据集 3.制作LMDB数据库文件 4.准备LeNet-5网络结构定义模型.prototxt文件 5.准备模型求解配置文件_sol ...

  2. 使用Caffe进行手写数字识别执行流程解析

    之前在 http://blog.csdn.net/fengbingchun/article/details/50987185 中仿照Caffe中的examples实现对手写数字进行识别,这里详细介绍下 ...

  3. 深度学习——手写数字识别

    深度学习--手写数字问题 前不久入门学习了Tensorflow深度学习框架,了解一下什么是神经网络和Tensorflow的简单使用.下面通过Tensorflow框架来建造神经网络模型来对手写数字进行训 ...

  4. python-机器学习-手写数字识别

    机器学习简单的来说,分为监督式学习和无监督式学习: 对于监督式学习就是需要人为的来告诉计算机这是什么,需要我们给他一个标签(答案). 无监督式学习就是不需要我们给出标签(答案). 图像识别(Image ...

  5. 深度学习——手写数字识别底层实现

    内容再要 手写数字识别,早在20世纪前,杨立昆(Yann LeCun)就完成这项工作,并在1980年左右利用卷积神经网络完善了手写数字识别 代码实现 import tensorflow as tf i ...

  6. 百度深度学习--手写数字识别之数据处理

    文章目录 概述 前提条件 读入数据并划分数据集 扩展阅读:为什么学术界的模型总在不断精进呢? 训练样本乱序.生成批次数据 校验数据有效性 机器校验 人工校验 封装数据读取与处理函数 异步数据读取 概述 ...

  7. 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 (zz)

    用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 我想写一系列深度学习的简单实战教程,用mxnet做实现平台的实例代码简单讲解深度学习常用的一些技术方向和实战样例.这 ...

  8. 深度学习数字仪表盘识别_【深度学习系列】手写数字识别实战

    上周在搜索关于深度学习分布式运行方式的资料时,无意间搜到了paddlepaddle,发现这个框架的分布式训练方案做的还挺不错的,想跟大家分享一下.不过呢,这块内容太复杂了,所以就简单的介绍一下padd ...

  9. 基于深度学习的手写数字识别算法Python实现

    摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...

  10. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

最新文章

  1. 在Zf2中实现Controller按照URL自动注册
  2. 单元测试试图告诉我们关于 Activity 的什么事情:第二部分
  3. 如何测量OP-AMP的非线性?
  4. jenkins安装(1)
  5. 在线查找和下载jar包的好工具maven repository
  6. linux 蓝牙编程avrcp,bluetooth(蓝牙) AVRCP协议概念及代码流程解析
  7. 大智慧公式系统:条件选股之基本技巧
  8. Postman汉化中文版
  9. 计算机桌面亮度调节,电脑屏幕亮度怎么调?笔记本屏幕亮度调节方法图解教程 电脑维修技术网...
  10. Vi IMproved
  11. virt a mate(vam)版本1.20.77.9介绍和下载
  12. 软件测试培训之十个无脚本测试方案
  13. 申论公文题-总结类-1
  14. 关于企业软件资质申请流程以及时间规划(一)——软件著作权申请
  15. 华为路由器可以连接几个设备_华为如何设置连接两个无线路由器
  16. 人工智能语言,我们的骄傲
  17. python 查找损坏图片_使用Python查找损坏的图像
  18. eclipse jee mars linux,【创建maven-web项目-eclipse-jee-mars-2-win32-x86_64-jdk1.8】
  19. 工作组计算机每次都要链接打印机,局域网打印机问题
  20. Java 设计模式(二)《建造者模式》

热门文章

  1. 凸优化第四章凸优化问题 4.7 向量优化
  2. SGU 176 Flow construction(有上下限的最小流)
  3. 同程艺龙10月初赴港IPO,小程序里又走出一家上市公司
  4. MySQL的快速修复
  5. 【转】HBase架构解析
  6. 负载均衡常见问题之会话保持-粘滞会话(Sticky Sessions)
  7. wget通过代理上网办法
  8. [2019.04.16] 由Python写成的自动解压脚本
  9. jQuery的一些基本的函数和用jQuery做一些动画操作
  10. jQuery应用实例4:下拉列表