转载请注明作者和出处:http://blog.csdn.net/c406495762

运行平台:Ubuntu14.04

安装完Caffe后,如何开始学习Caffe呢?一个不错的方法就是从Caffe自带的examples开始学起。在caffe安装的根目录下可以找到examples这个文件夹,这个文件里就包括了一些实例。本篇笔记就是使用CIFAR-10进行训练学习。

一、预备知识

1.深度学习中经常看到epoch、 iteration和batchsize,下面按自己的理解说说这三个的区别:

(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;

(2)iteration:1个iteration等于使用batchsize个样本训练一次;

(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

举个例子,训练集有1000个样本,batchsize=10,那么:

训练完整个样本集需要:

100次iteration,1次epoch。

2.Cifar-10数据集

Cifar-10是由Hinton的两个大弟子Alex Krizhevsky、Ilya Sutskever收集的一个用于普适物体识别的数据集。Cifar是加拿大政府牵头投资的一个先进科学项目研究所。

说白了,就是看你穷的没钱搞研究,就施舍给你。Hinton、Bengio和他的学生在2004年拿到了Cifar投资的少量资金,建立了神经计算和自适应感知项目。

Cifar-10由60000张32*32的RGB彩色图片构成,共10个分类。50000张训练,10000张测试(交叉验证)。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类(姊妹数据集Cifar-100达到100类,ILSVRC比赛则是1000类)。

二、训练流程概述

1.获取cifa10数据库。

2.图片格式转换:在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致。而在caffe中经常使用的数据类型是lmdb或leveldb,因此用Caffe进行训练,就需要这些原始图像需要进行格式转换。

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

4.prototxt配置文件,也就是我们使用的训练模型的设计。

5.训练模型。

三、动手实践

1.获取Cifar-10数据集

(1)进入自己的caffe根目录(CAFFE_ROOT),使用如下指令:

cd $CAFFE_ROOT

(2)运行作者为我们准备的脚本文件,使用如下指令:

./data/cifar10/get_cifar10.sh

(3)get_cifar10.sh脚本分析

从下面的shell脚本文件中可以看出:首先使用wget指令获取cifar-10-binary的下载,这个就是我们用到的原始Cifar-10数据集。解压tar.gz文件后再删除tar.gz。随后使用mv指令,将解压得到的cifar-10-batches-bin文件夹里的东西全部拷贝出来,保存到当前目录。最后删除cifar-10-batches-bin这个已经空了的文件夹。

#!/usr/bin/env sh
# This scripts downloads the CIFAR10 (binary version) data and unzips it.DIR="$( cd "$(dirname "$0")" ; pwd -P )"
cd "$DIR"echo "Downloading..."wget --no-check-certificate http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gzecho "Unzipping..."tar -xf cifar-10-binary.tar.gz && rm -f cifar-10-binary.tar.gz
mv cifar-10-batches-bin/* . && rm -rf cifar-10-batches-bin# Creation is split out because leveldb sometimes causes segfault
# and needs to be re-created.echo "Done."

(5)分析解压出来的四类文件:

  • 训练集原始图片:
data_batch_1.bin data_batch_2.bin data_batch_3.bin data_batch_4.bin data_batch_5.bin

在介绍Cifar-10数据集的时候已经说过,这五个文件就是那50000个训练集,每一个bin文件存放了1万张32*32的RGB彩色图片。

  • 测试集原始图片:
test_batch.bin

同样的,这个bin文件就是存放了1万张32*32的RGB彩色图片,这些图片是用来测试的。

  • 类别说明文件:
batches.meta.txt

可以通过cat batches.meta.txt查看这个文件的内容,发现这个文件是存储这些图片总共的类别的:airplane,automobile,bird,cat,deer,dog,frog,horse,ship,truck。同样,这些类别与上边介绍的Cifar-10数据集包含的类别对应。

  • readme文件:
readme.html

这个文件给了一个连接,是对于Cifar-10数据集的一些说明,以及一些使用方法。

至此,Cifar-10数据集获取完成。

2.图片格式转换和计算图片数据的均值

(1)进入自己的caffe根目录(CAFFE_ROOT),使用如下指令:

cd $CAFFE_ROOT

(2)运行作者为我们准备的脚本文件,使用如下指令:

./examples/cifar10/create_cifar10.sh

(3)create_cifar10.sh脚本分析

从下面的shell脚本文件中可以看出:首先删除了./examples/cifar10/cifar10_train_lmdb文件和./examples/cifar10/cifar10_test_lmdb文件,这样做的目的是为了再次生成lmdb文件做准备,将上一次生成的文件删除,重新生成lmdb文件。随后,使用./build/examples/cifar10/convert_cifar_data.bin工具将/data/cifar10中的原始图片转换成lmdb文件并将其保存到/examples/cifar10文件中,最后使用./build/tools/compute_image_mean工具根据/examples/cifar10/cifar10_train_lmdb(刚刚生成的)文件计算出这些训练集图片数据的均值,并将其保存到/examples/cifar10/mean.binaryproto文件中。

#!/usr/bin/env sh
# This script converts the cifar data into leveldb format.
set -eEXAMPLE=examples/cifar10
DATA=data/cifar10
DBTYPE=lmdbecho "Creating $DBTYPE..."rm -rf $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/cifar10_test_$DBTYPE./build/examples/cifar10/convert_cifar_data.bin $DATA $EXAMPLE $DBTYPEecho "Computing image mean..."./build/tools/compute_image_mean -backend=$DBTYPE \$EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/mean.binaryprotoecho "Done."

至此,一共生成了三个文件:cifar10_test_lmdb,cifar10_train_lmdb,mean.binaryproto。

  • cifar10_train_lmdb:用于Caffe训练的lmdb文件

  • cifar10_test_lmdb:用于Caffe测试的lmdb文件

  • mean.binaryproto:根据cifar10_train_lmdb计算出的图片数据均值

3.prototxt配置文件编写。

Caffe框架就是根据设置的prototxt文件,选择相应的模型进行训练的。此例程根据examples/cifar10/cifar10_quick_solver.prototxt这个配置文件建立模型。名为cifar10_quick_solver的CNN模型由卷基层(convolution)、池化层(pooling)、非线性ReLU层(rectified linear unit (ReLU) nonlinearities)和在顶端的局部对比归一化线性分类器组成(local contrast normalization with a linear classifier on top of it all)。
    由于作者已经给出了这个文件,因此我们不需要进行编写了,当然如果想要创建自己的模型训练数据,学习prototxt配置文件的编写就显得尤为重要了。prototxt配置文件的编写方法会在随后的笔记中进行讲解,现在可以看下这个配置文件的内容,眼熟一下,使用cat指令即可查看,具体内容如下:

name: "CIFAR10_quick"
layer {name: "cifar"type: "Data"top: "data"top: "label"include {phase: TRAIN}transform_param {mean_file: "examples/cifar10/mean.binaryproto"}data_param {source: "examples/cifar10/cifar10_train_lmdb"batch_size: 100backend: LMDB}
}
layer {name: "cifar"type: "Data"top: "data"top: "label"include {phase: TEST}transform_param {mean_file: "examples/cifar10/mean.binaryproto"}data_param {source: "examples/cifar10/cifar10_test_lmdb"batch_size: 100backend: LMDB}
}
layer {name: "conv1"type: "Convolution"bottom: "data"top: "conv1"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 32pad: 2kernel_size: 5stride: 1weight_filler {type: "gaussian"std: 0.0001}bias_filler {type: "constant"}}
}
layer {name: "pool1"type: "Pooling"bottom: "conv1"top: "pool1"pooling_param {pool: MAXkernel_size: 3stride: 2}
}
layer {name: "relu1"type: "ReLU"bottom: "pool1"top: "pool1"
}
layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 32pad: 2kernel_size: 5stride: 1weight_filler {type: "gaussian"std: 0.01}bias_filler {type: "constant"}}
}
layer {name: "relu2"type: "ReLU"bottom: "conv2"top: "conv2"
}
layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: AVEkernel_size: 3stride: 2}
}
layer {name: "conv3"type: "Convolution"bottom: "pool2"top: "conv3"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 64pad: 2kernel_size: 5stride: 1weight_filler {type: "gaussian"std: 0.01}bias_filler {type: "constant"}}
}
layer {name: "relu3"type: "ReLU"bottom: "conv3"top: "conv3"
}
layer {name: "pool3"type: "Pooling"bottom: "conv3"top: "pool3"pooling_param {pool: AVEkernel_size: 3stride: 2}
}
layer {name: "ip1"type: "InnerProduct"bottom: "pool3"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 64weight_filler {type: "gaussian"std: 0.1}bias_filler {type: "constant"}}
}
layer {name: "ip2"type: "InnerProduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10weight_filler {type: "gaussian"std: 0.1}bias_filler {type: "constant"}}
}
layer {name: "accuracy"type: "Accuracy"bottom: "ip2"bottom: "label"top: "accuracy"include {phase: TEST}
}
layer {name: "loss"type: "SoftmaxWithLoss"bottom: "ip2"bottom: "label"top: "loss"
}

4.训练模型

(1)进入自己的caffe根目录(CAFFE_ROOT),使用如下指令:

cd $CAFFE_ROOT

(2)运行作者为我们准备的脚本文件,使用如下指令:

./examples/cifar10/train_quick.sh

(3)train_quick.sh脚本分析

从下面的shell脚本文件中可以看出:使用caffe train指令根据cifar10_quick_solver.prototxt配置文件训练模型,随后在进行8次epochs之后学习率因子降低十分之一。

#!/usr/bin/env sh
set -eTOOLS=./build/tools$TOOLS/caffe train \--solver=examples/cifar10/cifar10_quick_solver.prototxt $@# reduce learning rate by factor of 10 after 8 epochs
$TOOLS/caffe train \--solver=examples/cifar10/cifar10_quick_solver_lr1.prototxt \--snapshot=examples/cifar10/cifar10_quick_iter_4000.solverstate.h5 $@

(4)其他
    运行的时候会出现类似以下的信息:

I0317 21:52:48.945710 2008298256 net.cpp:74] Creating Layer conv1
I0317 21:52:48.945716 2008298256 net.cpp:84] conv1 <- data
I0317 21:52:48.945725 2008298256 net.cpp:110] conv1 -> conv1
I0317 21:52:49.298691 2008298256 net.cpp:125] Top shape: 100 32 32 32 (3276800)
I0317 21:52:49.298719 2008298256 net.cpp:151] conv1 needs backward computation.

这是在搭建模型的相关信息:
    接着:

I0317 21:52:49.309370 2008298256 net.cpp:166] Network initialization done.
I0317 21:52:49.309376 2008298256 net.cpp:167] Memory required for Data 23790808
I0317 21:52:49.309422 2008298256 solver.cpp:36] Solver scaffolding done.
I0317 21:52:49.309447 2008298256 solver.cpp:47] Solving CIFAR10_quick_train

之后,训练开始

I0317 21:53:12.179772 2008298256 solver.cpp:208] Iteration 100, lr = 0.001
I0317 21:53:12.185698 2008298256 solver.cpp:65] Iteration 100, loss = 1.73
...
I0317 21:54:41.150030 2008298256 solver.cpp:87] Iteration 500, Testing net
I0317 21:54:47.129461 2008298256 solver.cpp:114] Test score #0: 0.5504
I0317 21:54:47.129500 2008298256 solver.cpp:114] Test score #1: 1.27805

其中每 100 次迭代次数显示一次训练时 lr(learning rate),和 loss(训练损失函数),每 500 次
测试一次,输出 score 0(准确率)和 score 1(测试损失函数)。

当 5000 次迭代之后,正确率约为 75%,模型的参数存储在二进制 protobuf 格式的cifar10_quick_iter_5000文件中。然后,这个模型就可以用来运行在新数据上了。我训练的结果如下图所示,可以看到准确率为76.25%。

对比CPU和GPU硬件加速,只需要简单地更改所有’cifar*solver.prototxt’(*是通配符)文件中的第一行solver_mode即可,solver_mode: CPU就是用CPU进行训练,solver_mode:GPU就是用GPU进行训练。

训练生成的文件:

  • cifar10_quick_iter_5000.caffemodel.h5:迭代5000次训练出来的模型,后面就用这个模型来做分类

  • cifar10_quick_iter_5000.solverstate.h5:也是迭代5000次训练出来的模型,应该是用来中断后继续训练用的文件。

对于如何使用自己训练好的cifar10_quick_iter_5000.caffemodel.h5模型进行图片预测,会在随后的笔记中进行讲解。

参考博客:

http://www.cnblogs.com/neopenx/p/4480701.html
    http://www.cnblogs.com/denny402/

参考笔记:

薛开宇Caffe读书笔记

Caffe学习笔记(一):CIFRA-10在Caffe上进行训练学习相关推荐

  1. Caffe学习笔记(二):Caffe前传与反传、损失函数、调优

    Caffe学习笔记(二):Caffe前传与反传.损失函数.调优 在caffe框架中,前传/反传(forward and backward)是一个网络中最重要的计算过程:损失函数(loss)是学习的驱动 ...

  2. TI CC2530 学习笔记-0-IAR 8.10下载与安装

    TI CC2530 学习笔记-目录 TI CC2530 学习笔记-0-IAR 8.10下载与安装 IAR 8.10下载:IAR8.10 for 8051 IAR 安装:安装教程

  3. Python学习笔记:Day 10 用户注册和登陆

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Intel VT学习笔记(三)—— VMCS(上)

    Intel VT学习笔记(三)-- VMCS(上) 要点回顾 VMCS 设置字段 错误排查 Fields Host-State Area VM-Control Fields 代码实现 参考资料 要点回 ...

  5. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  6. JavaScript学习笔记04【高级——DOM和事件的简单学习、BOM对象】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  7. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  8. NDK学习笔记:一起来变萝莉音!FMOD学习总结(下)

    NDK学习笔记:一起来变萝莉音!FMOD学习总结(下) 一.创建自己的变音demo 上一节我已经能够在AndroidStudio上跑起了fmod的基础教程.还有疑问的同学可以重新阅读跟着来跑一次.这章 ...

  9. 【vn.py学习笔记(二)】vn.py底层接口 学习笔记

    [vn.py学习笔记(二)]vn.py底层接口 学习笔记 1 CTP API的工作原理 1.1 CTP介绍 1.2 API功能介绍 1.3 CTP API文件 1.4 API 通用规则 2 CTP A ...

  10. 【vn.py学习笔记(三)】vn.py事件引擎 学习笔记

    [vn.py学习笔记(三)]vn.py事件引擎 学习笔记 1 时间驱动 2 事件驱动 3 事件引擎工作流程 4 事件引擎结构 4.1 事件队列 4.2 事件处理线程 4.3 事件处理函数字典/通用事件 ...

最新文章

  1. Linux vi 命令使用说明
  2. gcc编译器java_「gcc编译器下载」gcc编译器下载各版本下载 - seo实验室
  3. 2017-2018-1 20155317 《信息安全系统设计基础》第四周学习总结
  4. 多模块顺序_软件架构基础 3: 什么是好的模块化代码?高内聚、低耦合如何衡量?...
  5. 连接数mysql证登录名和密码_mysql连接数
  6. 帆软高级函数应用之时间函数
  7. 多年前,初始架构:php+mysql下,对网站架构方面的一些认识
  8. oracle vm 4.3.12,Oracle VM VirtualBox 4.3.12_ZZZZ这个程序肿么卸载啊,卸载不了
  9. 台式计算机颜色如何矫正,显示器颜色校正,详细教您怎么校准显示器颜色
  10. 有效的数独 python_LeetCode 36. 有效的数独 | Python
  11. Mac影音多媒体工具软件推荐
  12. 光电耦合器简单介绍以及作用
  13. 2022年最新二手苹果手机价格表
  14. 非线性方程模型及求解实例
  15. python画人脸编程怎么写_如何在Python(GUI)中绘制人脸
  16. Maya创建重力动力模型教程!
  17. 扁平化数组的几种方法
  18. Blender导出模型规范检查
  19. 证件照制作小程序源码下载-超级实用工具
  20. Java 获取对象占用内存大小

热门文章

  1. cur前缀_每个人必知的英语前缀大全
  2. 分布式的Scrapy过于能打!十个resquests都顶不住! ๑乛◡乛๑ Scrapy框架使用方法
  3. imap能和服务器同步文件夹吗,IMAP 同步
  4. 为什么配置智能DNS解析的时候一定要有默认线路?
  5. 系统性谈谈软件可靠性——第3讲:软件可靠性设计方法
  6. 详解CAN总线:什么是CAN总线?
  7. android系统怎么连不上wifi,为什么手机连接不上wifi wifi连不上怎么办
  8. 计算机组成原理——指令系统
  9. linux用ping命令测试网速,如何用ping 命令简单测试网速
  10. Windows系统下Android DNK r5环境配置和开发(二)