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

转载请注明作者和出处: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.gz echo "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.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 -e

EXAMPLE=examples/cifar10
DATA=data/cifar10
DBTYPE=lmdb

echo "Creating $DBTYPE..."

rm -rf $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/cifar10_test_$DBTYPE

./build/examples/cifar10/convert_cifar_data.bin $DATA $EXAMPLE $DBTYPE

echo "Computing image mean..."

./build/tools/compute_image_mean -backend=$DBTYPE \
  $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/mean.binaryproto

echo "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: 100 backend: 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: 100 backend: LMDB }
}
layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 }
  param { lr_mult: 2 }
  convolution_param { num_output: 32 pad: 2 kernel_size: 5 stride: 1 weight_filler { type: "gaussian" std: 0.0001 }
    bias_filler { type: "constant" }
  }
}
layer { name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { pool: MAX kernel_size: 3 stride: 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: 32 pad: 2 kernel_size: 5 stride: 1 weight_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: AVE kernel_size: 3 stride: 2 }
}
layer { name: "conv3" type: "Convolution" bottom: "pool2" top: "conv3" param { lr_mult: 1 }
  param { lr_mult: 2 }
  convolution_param { num_output: 64 pad: 2 kernel_size: 5 stride: 1 weight_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: AVE kernel_size: 3 stride: 2 }
}
layer { name: "ip1" type: "InnerProduct" bottom: "pool3" top: "ip1" param { lr_mult: 1 }
  param { lr_mult: 2 }
  inner_product_param { num_output: 64 weight_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: 10 weight_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 -e

TOOLS=./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读书笔记

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


目录前言一、创建Hadoop用户二、更新apt和安装Vim编辑器三、安装SSH和配置SSH无密码登录四、安装Java环境1. 安装JDK2. 配置JDK环境3. 检验安装五、安装单机Hadoop1. 下载安装Hadoop2. 运行示例总结前言本文安装的 Hadoop 及 Java 环境基于林子雨老师的《大数据技术原理与应用(第3版)》中所要求,其中Java 版本为1.8.0_301,Hadoop 版本为3.3.1,其他版本的安装请参考其他博客。..
原文连接:https://www.cnblogs.com/yasmi/p/5192694.html  运行django出现错误信息:[2016-02-16 14:33:24,476 pyinotify ERROR] add_watch: cannot watch /usr/local/lib/python2.7/dist-packages/django/contrib/sessio...
电脑重启后,打开VirtualBox,发现一直用的虚拟机莫名的消失了,如下:别着急,以下教你如何找回之前的虚拟机:1、点击控制,然后选择注册,找到虚拟机的安装目录,比如:C:UserstxVirtualBox VMs,然后选择需要找回的虚拟机vbox,点击打开按钮即可:2、如果打开后报错,则执行第三步:3、删除ubuntu.vbox,然后将ubuntu.vbox-prev重命名为ubuntu.vbox,然后再执行第二步即可...
参见:https://blog.csdn.net/weixin_38883338/article/details/82153933 https://blog.csdn.net/github_39533414/article/details/85211012
Ubuntu 18.04 LTS 已切换到 Netplan 来配置网络接口。Netplan 基于 YAML 的配置系统,使得配置过程非常简单。Netplan 替换了我们之前在 Ubuntu 中用于配置网络接口的旧配置文件/etc/network/interfaces。在本文中,我们将学习如何使用 Netplan 在 Ubuntu 中配置网络。我们将看到静态和动态 IP 配置。我将使用 Ubuntu 18.04 LTS 来描述本文中提到的过程。使用 Netplan 配置网络您可以在/etc
介绍每个 Web 服务都可以通过特定的 URL 在 Internet 上访问,该 URL 代表一种“替代名称”,用于标识提供该服务的服务器的 IP 地址和端口。同一台机器可以同时在不同的端口上提供不同的服务。出于安全原因,可能需要屏蔽 Web 服务的端口号,从而在外部显示与服务实际侦听的端口号不对应的端口号。感谢本教程,您将能够管理您的服务器端口,配置集成在 Ubuntu 中的 UFW 防火墙。特别是,按照指南的说明,您将学习将来自某个端口的请求转发到另一个端口(端口转发),同时使用后者提供的.
Observium 是一个免费和开源的 sa 网络管理和监控系统工具。我们可以使用 SNMP 收集数据,它允许监控所有网络设备。它提供了一个简单易用的 Web 界面。它基于 PHP 并使用 MySQL 数据库来存储数据。在 ubuntu 上设置 Observium 有几个步骤:第 1 步:更新系统。apt-get update第 2 步:安装 PHP 和模块。apt install wget apache2 php php-{pear,cgi,common,curl,mbstring,g
从 20.04 开始,Ubuntu 决定更新实时服务器安装程序以实现自动安装规范,以便能够仅使用 Subiquity 完全自动化安装过程。Subiquity 是新的服务器安装程序(又名“服务器无处不在”),旨在取代之前基于 debian-installer 的经典系统。本文说明了如何使用 Packer 和 Proxmox 上的 Subiquity 生成 Ubuntu Server 20.04 图像模板。介绍Subiquity 仅在live图像文件版本中可用(例如ubuntu-20.0...
Ubuntu 将停止支持 Debian 安装程序(预置)。Ubuntu Server 20.04 附带了一种新的自动化操作系统安装方法,称为带有 subiquity 服务器安装程序的自动安装。这篇文章展示了使用新安装程序构建的打包程序。此设置仅适用于 Ubuntu-20.04 live-server 而不是旧版。SubiquitySubiquity 是 Ubuntu 服务器的新自动安装程序,它是在 18.04 中引入的。自动安装的设置由 cloud-init 配置提供。如果设置,将从配置文件.
此页面的目的是提供在您机器上的 VM 中执行自动安装的简单说明。此页面假设您使用的是 amd64 架构。s390x也有一个版本。通过网络提供自动安装数据这种方法是最容易推广到完全基于网络的安装的方法,在这种安装中,机器会进行网络引导,然后自动安装。下载 ISO转到20.04 ISO 下载页面并下载最新的 Ubuntu 20.04 实时服务器 ISO。挂载 ISOsudo mount -r ~/Downloads/ubuntu-20.04-live-server-amd64...
FTP 或文件传输协议是一种非常古老的知名协议,用于在客户端和服务器之间传输文件。它也是一个不安全的协议,仅在没有 TLS 的情况下使用。在本教程中,我们将为 TLS 配置 vsftpd,它允许我们安全地使用 FTP。如今,FTP 经常被更安全的协议所取代,例如 SFTP 或 SCP。但是,如果您需要在服务器上使用 FTP,vsftpd(Very Secure FTP Daemon)是一个完美的选择。在本教程中,我们将学习如何在基于 Ubuntu 20.04 的服务器上使用 vsft
使用cloud-init快速启动来宾操作系统的能力通常与在 EC2 或 Azure 等 IaaS 中部署虚拟机相关。但是 cloud-init 不仅仅适用于远程云提供商,将 cloud-init 用于可以快速部署在 KVM 中的本地映像非常适合本地开发和测试。本文将逐步测试 KVM 上的来宾 Ubuntu 仿生云映像。先决条件作为本文的先决条件,您必须按照此处所述安装 KVM 和 libvirt。还要安装管理云图像所需的附加包:sudo apt-get install -y
Window Linux双系统安装历程今天下午搞了几个小时,可谓是困难重重,但是实际上只是被一个很小的问题困住了,其它地方都很简单。接下来简单讲一下安装的步骤以及遇到的问题。先讲一下设备状况:一台12年买的i3 window7 待报废的lenovo 笔记本一个32g的usb3.0另一台新的win10笔记本电脑磁盘分区首先要在安装双系统的电脑上,划分硬盘中的一个分区来装linxu。点击我的电脑(此电脑)-&gt;管理-&gt; 磁盘管理比如这里我们的e盘原本有98.55g,然后还有
https://pinyin.sogou.com/linux/help.php 安装指南 Ubuntu搜狗输入法安装指南 搜狗输入法已支持Ubuntu1604、1804、1910、2004、2010
在home主文件夹里面。
格式:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除 -f 就是直接强行删除,不作任何提示的意思 名称 概述 描述 选项
https://blog.csdn.net/qq_29985391/article/details/78008864 https://blog.csdn.net/wangxin0205/article
echo $ROS_PACKAGE_PATH
https://blog.csdn.net/weixin_37657720/article/details/80645991 :q! 不保存强制推出。 :wq 保存并退出。
https://blog.csdn.net/xin_101/article/details/88624726 https://blog.csdn.net/qq_15192373/article/det