文档章节

Caffe第一个例子

propagator
 propagator
发布于 2017/06/26 18:55
字数 1639
阅读 175
收藏 0
点赞 0
评论 0

安装好caffe之后,可以尝试下caffe自带的例子mnist。官方教程如下:

http://caffe.berkeleyvision.org/gathered/examples/mnist.html

 

首先运行如下命令,下载MNIST数据

cd $CAFFE_ROOT
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh

其中$CAFFE_ROOT代表安装caffe的目录。但是很可能无法下载,因为要求安装wget和gunzip,而windows下wget和gunzip需要另行安装。因此可查看get_mnist.sh文件,手动下载如下四个文件

http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz

http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz

http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz

http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

下载之后解压到$CAFFE_ROOT/data/mnist/文件夹下。如下图所示

此处CaffeBVLC\caffe目录即为$CAFFE_ROOT。

 

接下来将$CAFFE_ROOT\build\examples\mnist\Release\convert_mnist_data.exe复制到$CAFFE_ROOT\examples\mnist\目录下,并执行如下指令

cd $CAFFE_ROOT\examples\mnist
convert_mnist_data.exe ..\..\data\mnist\train-images-idx3-ubyte \
  ..\..\data\mnist\train-labels-idx1-ubyte mnist_train_lmdb --backend=lmdb
convert_mnist_data.exe ..\..\data\mnist\t10k-images-idx3-ubyte \
  ..\..\data\mnist\t10k-labels-idx1-ubyte mnist_test_lmdb --backend=lmdb

注意执行过程中可能遇到缺少dll的报错,把所有缺少的dll都从$CAFFE_ROOT目录中找到,然后复制到$CAFFE_ROOT\examples\mnist目录中即可,如下图所示(python27.dll需从python安装目录处获得;或者在Anaconda的python2.7终端中运行,则无需复制python27.dll。以下命令皆为在Anaconda环境中执行)

执行上述指令后,该目录下多了两个目录,mnist_test_lmdb和mnist_train_lmdb,如上图所示。

 

将之前可以成功运行的caffe.exe所在目录添加到PATH环境变量中,该目录为$CAFFE_ROOT\build\tools\Release,然后在$CAFFE_ROOT目录下运行如下命令(此处可参考上一篇文章 《Windows下安装TensorFlow和Caffe》

cd $CAFFE_ROOT
caffe.exe train --solver=examples\mnist\lenet_solver.prototxt

运行结果如下

上图的输出表明,caffe成功运行,对mnist数据集进行了训练和测试。训练模型保存在$CAFFE_ROOT\examples\mnist\lenet_iter_10000.caffemodel文件中,可部署在应用中进行识别。

 

下面简单介绍一下caffe中的模型定义和配置文件。首先看看lenet_solver.prototxt,其内容如下

# 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: CPU

第一行定义了模型文件的位置,后面两行定义了测试迭代次数,迭代100次,每500次训练进行一次网络测试。base_lr,momentum和weight_decay定义了网络学习速率,动量和权重衰减速率。lr_policy,gamma和power定义了优化算法及参数,display定义了每100次迭代显示一次结果,max_iter定义了最大迭代次数。snapshot和snapshot_prefix定义了每隔多少次训练保存一次网络参数,以及网络参数保存的文件前缀(包括目录)。solver_mode定义了CPU计算还是GPU计算。

 

然后看看lenet_train_test.prototxt

name: "LeNet"
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
  }
}
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"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "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"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

 

首先是定义网络名称

name: "LeNet"

 

然后是把数据读入网络的数据层,其中一个数据层仅用于训练(train),另一个仅用于测试(test)

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

该层名称为mnist,类型为数据层,从给定的lmdb数据源中读取数据。batch_size定义了一次读入的数据量,0.00390625表示1/256,给出像素标度,使其值为[0,1)之间。该层给出两个输出单元(top),一个是数据单元,一个是标签单元。

 

然后是卷积层

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}

该层以上一层输出的数据单元作为输入,产生20个输出通道,其卷积核大小为5,stride为1。fillers通过随机方式初始化权重和偏差,对于权重fillers,采用xavier算法以自动根据输入输出神经元数量决定初值大小。对于bias fillers,简单将其置为常数0。lr_mults是可动态调整的学习速率,此处设置权重学习速率为solver中设置的值,而常数学习速率则为solver中的两倍,这样通常会带来更好的收敛性。

 

然后是Pooling层

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

此处采用最大pooling,pool核为2,stride为2。类似地,在lenet_train_test.prototxt中可看到第二个卷积层和pooling层。

 

然后是全连接层

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

此处定义了一个500个输出的全连接层。

 

然后是ReLU层

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

由于ReLU是元素级操作,可以直接修改元素以节约内存,这一点通过定义相同名称的top和bottom来实现。在ReLU层之后,可以定义另一个全连接层,见lenet_train_test.prototxt。

 

最后是loss层,

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

softmax_loss层实现了softmax和多维对数loss。其有两个输入,第一个是计算结果,第二个是数据层的标签。该层并不产生任何输出,仅计算loss函数的值,然后通过反向传播算法初始化梯度。

 

注意lenet_train_test.prototxt中还有一个accuracy层,该层的作用和loss层相同,唯一的区别是accuracy仅在测试中用于计算精度。

© 著作权归作者所有

共有 人打赏支持
propagator
粉丝 6
博文 25
码字总数 27809
作品 0
昆明
windows7+visual studio 2013+CUDA7.5 编译caffe+配置matcaffe+配置pycaffe

经过朋友指导,终于成功在windows7上成功编译了caffe,这里将编译过程记录 安装文件准备 1 visual studio 2013安装包下载 2 CUDA75 optional 3 windows版本caffe 4 下载cuDNN optional 5 下载...

JungleKing
2016/12/27
778
0
deep learning---利用caffe在vgg-face上finetuing自己的人脸数据

Abstract:本文将讲解如何利用自己的人脸数据在vgg-face上finetuing,主要包括数据的生成和文件的设置,以及最后的运行。 1.代码和文件准备 代码caffe:http://caffe.berkeleyvision.org/,这...

hlx371240
2016/05/12
0
0
16- 深度学习之神经网络核心原理与算法-caffe&keras框架图片分类

之前我们在使用cnn做图片分类的时候使用了CIFAR-10数据集 其他框架对于CIFAR-10的图片分类是怎么做的 来与TensorFlow做对比。 Caffe Keras 安装 官方安装文档: https://github.com/IraAI/ca...

天涯明月笙
06/04
0
0
开源神经网络框架Caffe2全介绍

雷锋网按:本文作者吴逸鸣,整理自作者在GTC China 2017大会上的演讲,首发于作者的知乎文章,雷锋网获其授权发布。 我个人认为这是一份很值得分享的资料,因为: 这应该是第一次使用全中文来...

AI研习社
2017/12/11
0
0
跟我上手深度学习: 五分钟尝试第一个深度学习(Caffe)训练和图像分类(详细图文步骤)

申请深度学习的开发环境 Supervessel超能云(www.ptopenlab.com)上可以免费申请深度学习的开发环境。用户可以免费注册一个用户帐号,无须任何信用卡信息,就可以申请。 申请了用户帐号后,进入...

lindylin
2016/06/05
2.2K
0
Ubuntu16.04---腾讯NCNN框架入门到应用

Ubuntu16.04—腾讯NCNN框架入门到应用 前言 两天前腾讯发布NCNN深度学习框架后,发现可能有些同学对如何使用这些框架并不是十分的了解,一方面这是一个新的框架,另一方面Tencent出的文档对一...

best_coder
2017/07/27
0
0
读源码品Caffe - 结构流程篇

原文链接: https://blog.csdn.net/jinzhuojun/article/details/79834697 背景 本文主要介绍深度学习框架Caffe的工作原理和实现。时至今日,各种深度学习框架百花齐放,百家争鸣,从流行程度来...

ariesjzj
04/07
0
0
在Caffe中加Python Layer的方法

Author: Zongwei Zhou | 周纵苇 Weibo: @MrGiovanni Email: zongweiz@asu.edu Acknowledgement: Md Rahman Siddiquee (mrahmans@asu.edu) Caffe的参考文档非常少,自己改代码需要查阅网上好多......

MrGiovanni
2017/11/27
0
0
10km/caffe-static

0. who am i? 在caffe应用到工程实现时,为了方便系统安装,需要尽可能减少软件的依赖库。 本项目以bash shell/PowerShell脚本实现将caffe依赖的所有第三方库与caffe静态编译一起,以满足全静...

10km
2017/07/09
0
0
Caffe Windows系列(2): 使用C++ API进行分类

由于我的目标就是用Caffe来做图像的分类,而且是要用C++来做图像的分类。那么,目前最重要的事就是要验证一下能不能用Caffe做这件事,以及Caffe是怎么做这件事的。看到官网上提供了一个例子:...

行之与亦安
2017/04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
3
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部