在购买视频后没有学明白,只能自己看官网文档了,就顺便把中文版写出来了,后期对于各个层的理解更深了之后会添加更多的注释,如有错误请指正

可以给我发邮件845832282@qq.com

使用Caffe在MNIST上训练LeNet
我们将假设你已经成功编译了Caffe。如果没有,请参阅安装页面。在本教程中,我们假设您的Caffe安装位于CAFFE_ROOT。

准备数据集
您首先需要从MNIST网站下载并转换数据格式。为此,只需运行以下命令:
#CAFFE_ROOT就是你编译caffe的根目录
cd $CAFFE_ROOT
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
如果它提示wget或gunzip没有安装,你需要分别安装它们。运行脚本后,应该有两个数据集mnist_train_lmdb,和mnist_test_lmdb。
#下载大概需要3分钟,这个根据网络情况

LeNet:MNIST分类模型
在我们真正运行训练程序之前,让我们解释一下会发生什么。我们将使用LeNet网络,它已经在数字分类任务上工作良好。我们将使用一个与原始LeNet实现略有不同的版本,用神经元的整流线性单元(ReLU)激活替代S型激活。

#####这的每个单词的翻译都是对的,但是读起来就是感觉不对劲,请指正。

LeNet的设计包含CNN的本质,仍然用于较大的模型,如ImageNet中的模型。一般来说,它包括卷积层,后面跟着一个池化层,另一个卷积层跟着一个池化层,然后是两个全连接的层,类似于传统的多层感知器。我们已经定义了层$CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt。

定义MNIST网络
本节介绍了lenet_train_test.prototxt为MNIST手写数字分类指定LeNet模型的模型定义。我们假设您已经熟悉Google Protobuf,并假设您已经阅读了Caffe使用的protobuf定义,您可以在这里找到$CAFFE_ROOT/src/caffe/proto/caffe.proto。

具体来说,我们将写一个caffe::NetParameter(或在python中caffe.proto.caffe_pb2.NetParameter)protobuf。我们将首先给网络一个名字:

name: "LeNet"

编写数据层

目前,我们将从我们之前演示中创建的lmdb中读取MNIST数据。这由数据层定义:

layer {
name: "mnist"
type: "Data"
transform_param {
scale: 0.00390625
}
data_param {
source: "mnist_train_lmdb"
backend: LMDB
batch_size: 64
}
top: "data"
top: "label"
}
具体来说,此层具有名称mnist和类型data,并且从给定的lmdb源读取数据。我们将使用一个尺寸为64的批量,并缩放传入像素,以使它们在范围[0,1]内。为什么是0.00390625?它是1除以256.最后,这层产生两个blob,一个是datablob,一个是labelblob。

编写卷积层

让我们定义第一个卷积层:

layer {
name: "conv1"
type: "Convolution"
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"
}
}
bottom: "data"
top: "conv1"
}
此图层采用datablob(由数据层提供),并生成conv1图层。它产生20个通道的输出,卷积核大小为5,并以步长为1执行。

填充物允许我们随机初始化权重和偏差的值。对于重量填充器,我们将使用xavier基于输入和输出神经元的数量自动确定初始化规模的算法。对于偏置填充,我们将其简单地初始化为常量,默认填充值为0。

lr_mults是层的可学习参数的学习速率调整。在这种情况下,我们将设置权重学习率与运行时期间求解器给定的学习率相同,偏差学习率为其两倍 - 这通常会导致更好的收敛速度。

编写池化层

哈、池层实际上更容易定义:

layer {
name: "pool1"
type: "Pooling"
pooling_param {
kernel_size: 2
stride: 2
pool: MAX
}
bottom: "conv1"
top: "pool1"
}
这说明我们将执行最大池化与池化核大小2和步长为2(所以在相邻池化区之间没有重叠)。

类似地,您可以写出第二个卷积和合并层。详细信息请查看$CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt。

编写全连接层

编写全连接层也很简单:

layer {
name: "ip1"
type: "InnerProduct"
param { lr_mult: 1 }
param { lr_mult: 2 }
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
bottom: "pool2"
top: "ip1"
}
这定义了有500个输出的全连接层(在Caffe中称为内积层)。所有其他参数看起来很熟悉,对吧?

编写ReLU层

ReLU层也很简单:

layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
由于ReLU是一个元素操作,我们可以直接本地操作以节省一些内存。这是通过简单地给底部和顶部blob相同的名称来实现的。当然,不要对其他层使用重复的blob名称!

在ReLU层之后,我们将写另一个内积层:

layer {
name: "ip2"
type: "InnerProduct"
param { lr_mult: 1 }
param { lr_mult: 2 }
inner_product_param {
num_output: 10
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
bottom: "ip1"
top: "ip2"
}
编写损失层

最后,我们会编写损失层!

layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
}
该softmax_loss层实现softmax和多项式对数损失(节省时间并提高数值稳定性)。它用了两个blob,第一个是预测,第二个是label由数据层提供的(记住了吗?)。它不产生任何输出 - 它所做的是计算损失函数值,在反向传播开始时报告,并启动相对的梯度ip2。这是所有魔力开始的地方。

附加注释:编写层规则

层定义可以包括是否以及何时将它们包括在网络定义中的规则,如下所示:

layer {
// ...层定义...
include: { phase: TRAIN }
}
这是一个规则,它根据当前网络的状态控制网络中的层包含。您可以参考$CAFFE_ROOT/src/caffe/proto/caffe.proto有关层规则和模型模式的更多信息。

在上述示例中,该层将仅在训练数据阶段被使用。如果我们把TRAIN改为TEST,那么该层将仅在测试阶段时使用。默认情况下,这是没有层规则,一个层总是包括在网络中。因此,lenet_train_test.prototxt具有两个数据层定义(具有不同的batch_size),一个用于训练阶段,一个用于测试阶段。此外,存在精度层仅在TEST阶段中包括的层,用于每100次迭代报告模型精度,形如在 lenet_solver.prototxt 中定义。

定义MNIST Solver
查看解释原始文本中每行的注释$CAFFE_ROOT/examples/mnist/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: GPU
训练和测试模型
在编写网络定义protobufsolver protobuf文件之后,训练模型很简单。只需运行train_lenet.sh,或直接执行以下命令:

cd $CAFFE_ROOT
./examples/mnist/train_lenet.sh
train_lenet.sh是一个简单的脚本,但这里是一个快速的解释:主要的工具是caffe用动作train和solver protobuf文本文件作为其参数。

当你运行代码,你会看到很多消息在命令行中打印像这样:

I1203 net.cpp:66] Creating Layer conv1
I1203 net.cpp:76] conv1 <- data
I1203 net.cpp:101] conv1 -> conv1
I1203 net.cpp:116] Top shape: 20 24 24
I1203 net.cpp:127] conv1 needs backward computation.
这些消息告诉您每个层,其连接和其输出形状的详细信息,这可能有助于调试。初始化后,训练将开始:

I1203 net.cpp:142] Network initialization done.
I1203 solver.cpp:36] Solver scaffolding done.
I1203 solver.cpp:44] Solving LeNet

基于 solver 设置,我们将每100次迭代打印训练损耗函数,并且每500次迭代测试网络。您将看到如下消息:

I1203 solver.cpp:204] Iteration 100, lr = 0.00992565
I1203 solver.cpp:66] Iteration 100, loss = 0.26044
...
I1203 solver.cpp:84] Testing net
I1203 solver.cpp:111] Test score #0: 0.9785
I1203 solver.cpp:111] Test score #1: 0.0606671
对于每个训练迭代,lr是该迭代的学习速率,并且loss是训练函数。对于测试阶段的输出,得分0是准确度,得分1是测试损失函数。

几分钟后,你完成了!

I1203 solver.cpp:84] Testing net
I1203 solver.cpp:111] Test score #0: 0.9897
I1203 solver.cpp:111] Test score #1: 0.0324599
I1203 solver.cpp:126] Snapshotting to lenet_iter_10000
I1203 solver.cpp:133] Snapshotting solver state to lenet_iter_10000.solverstate
I1203 solver.cpp:78] Optimization Done.
最终模型存储为二进制protobuf文件

lenet_iter_10000
如果您在真实世界的应用程序数据集上进行培训,您可以在应用程序中将其部署为受过训练的模型。

呃...... GPU训练怎么样?

你刚才!所有的训练都是在GPU上进行的。事实上,如果你想做CPU的培训,你可以简单地改变一行lenet_solver.prototxt:

# solver mode: CPU or GPU
solver_mode: CPU
你将使用CPU进行培训。那不是很容易吗?

MNIST是一个小数据集,因此,使用GPU的培训不会因为通信开销而真正带来太多的好处。对于具有更复杂模型的较大数据集,例如ImageNet,计算速度差异将更加显着。

如何降低固定步骤的学习率?

看看lenet_multistep_solver.prototxt

转载于:https://www.cnblogs.com/HugoLester/p/6495531.html

caffe MNIST官方文档中文版相关推荐

  1. Caffe ImageNet官方文档中文版

    文档大部分都是机翻,本人英语未过四级,所以凑合看吧 构建ImageNet 本指南旨在让您准备好根据自己的数据训练自己的模型.如果你只是想要一个ImageNet训练的网络,那么注意,由于训练需要很多电能 ...

  2. TensorFlow 官方文档中文版发布啦(持续维护)

    TensorFlow 是 Google 研发的第二代人工智能学习系统,是 Google 为了帮助全球开发者们更加方便和高效地开发机器学习 (Machine Learning)和人工智能 (AI) 应用 ...

  3. scikit-learn (sklearn) 官方文档中文版

    scikit-learn (sklearn) 官方文档中文版 sklearn 0.21.3 中文文档 sklearn 0.21.3 中文示例 sklearn 英文官网 介绍 sklearn (scik ...

  4. tensorflow 官方文档中文版 tensorflow教程 tensorflow教学

    github链接:TensorFlow 最新官方文档中文版 文档链接:https://tensorflow.juejin.im/get_started/ 理论上来说,只要仔细阅读官方文档,便能对ten ...

  5. TensorFlow 官方文档中文版

    TensorFlow 官方文档中文版: http://wiki.jikexueyuan.com/project/tensorflow-zh/ w3cschool https://www.w3cscho ...

  6. TensorFlow 官方文档中文版发布啦(持续维护) 1

    TensorFlow 是 Google 研发的第二代人工智能学习系统,是 Google 为了帮助全球开发者们更加方便和高效地开发机器学习 (Machine Learning)和人工智能 (AI) 应用 ...

  7. jQuery 1.4官方文档中文版

    jQuery 1.4在本月早些时候发布了.这个版本包含了大量的编程,测试和记录文档的工作.这份官方文档总结了jQuery 1.4当中加入的变更和功能,很多常用和热门的方法被重写,性能得到了很大的提升. ...

  8. 2DToolkit官方文档中文版打地鼠教程(一):初始设置

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...

  9. “scikit-learn(sklearn) 官方文档中文版”

    "scikit-learn(sklearn) 官方文档中文版" 本博客摘自微博:爱可可-爱生活 "scikit-learn(sklearn) 官方文档中文版" ...

最新文章

  1. 打印html5中Canvas的方法
  2. C++程序的内存布局
  3. 大数据架构如何做到流批一体?
  4. 截取指定字符前_VBA学习笔记35-1:字符串拆分与组合
  5. leetcode208. 实现 Trie (前缀树)
  6. 大学计算机课程考试系统C语言题库,《大学计算机基础》考试题库(含答案).doc...
  7. devops与itsm集成_如何解决DevOps与ITSM文化冲突
  8. c语言银行卡管理系统程序设计报告,C语言课程设计报告(银行账户信息管理系统).doc...
  9. Linux 中断总结
  10. java对redis的基本操作 - edisonfeng
  11. 移动硬盘做笔记本硬盘
  12. 判断质数和合数python代码_【奇技淫巧】利用正则进行需要整除操作的判断,如:奇偶性,质数合数...
  13. 美国金融客户投诉数据分析
  14. 手势识别整体设计流程方案
  15. Linux内存memtest,详细讲解 Linux极品内存检测软件 Memtest86
  16. HmailServer部署应用(完整过程,含故障处理)
  17. XCTF---MISC---来自银河的信号
  18. 用友ORACLE笔记
  19. 【微信小程序开发】(三)首页banner组件使用swiper
  20. php mysql中文乱码怎么解决_php读取mysql中文乱码怎么解决?

热门文章

  1. 作为一个互联网人,这部电影你不得不看
  2. 一次 Discuz X3.2 切换数据库后无法登录的问题排查经历
  3. Apache Kafka
  4. Spring ROO初体验
  5. struts2 配置
  6. 性能报告——使用AOP与DYNAMICProxy的orm性能测试
  7. 必背42个单词_高中英语必背100个常考单词,考试必考
  8. bigdicmal除法精度设置_java中BigDecimal进行加减乘除的基本用法
  9. python 与或非_“2020”假看完本文若不能让你学通“Python”,我将永远退出IT界!...
  10. oracle可以在liux上装_linux安装Oracle11G