学习搭建自己的网络MNIST在caffe上训练学习
2016-01-27 14:10
513 查看
参照薛开宇的学习笔记学习,全文几乎是跟着他的方法走的,只是贴出自己的一些错误和不同的地方。
1 准备数据库:MNST手写字体库
之后会出现mnist-train-lmdb、mnist-val-lmdb两个文件夹
2 训练模型的解释
我们将使用 LeNet 的训练网络,这是一
个被认为在数字分类任务中运行很好的网络,我们会运用一个和原始版本稍微不同的版本,
这次用 ReLU(线性纠正函数)取代 sigmoid 函数去激活神经元这次设计包含 CNNs 的精髓,即像训练 imageNet 那样也是运用较大的训练模型。一般来说,由一层卷基层后跟着池层,然后再是卷基层,最后两个全连接层开始于传统的多层感知器,我们在 CAFFE_ROOT/data/lenet.prototxt.中已经定义了层
3 定义MNIST训练网络
这部分介绍如何使用 lenet_train.prototxt,我们假设您已经熟悉 Google Protobuf(主要作
用是把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议格式等场
合。
)
,同时假设已经阅读了 caffe 中的 protobuf 定义(可以在 src/caffe/proto/caffe.proto.找到)
这个文档可以在我们建立自己的网络时,方便我们查到我们需要的格式。我们将尝试写一个 caffe 网络参数 protubuf,先观察一下传统的网络,但实际上 caffe 上的对这个网络有点改变,例如 C1 层是 20 个feature maps,第 C3 层是 50 个,C5 层是 500 个,没有 F6 层,直接是 OUTPUT 层。
这篇文章主要还是弄清楚网络定义中的这些代码的意思。
1 准备数据库:MNST手写字体库
[code]./get_mnist.sh ./creat_mnist.sh
之后会出现mnist-train-lmdb、mnist-val-lmdb两个文件夹
2 训练模型的解释
我们将使用 LeNet 的训练网络,这是一
个被认为在数字分类任务中运行很好的网络,我们会运用一个和原始版本稍微不同的版本,
这次用 ReLU(线性纠正函数)取代 sigmoid 函数去激活神经元这次设计包含 CNNs 的精髓,即像训练 imageNet 那样也是运用较大的训练模型。一般来说,由一层卷基层后跟着池层,然后再是卷基层,最后两个全连接层开始于传统的多层感知器,我们在 CAFFE_ROOT/data/lenet.prototxt.中已经定义了层
3 定义MNIST训练网络
这部分介绍如何使用 lenet_train.prototxt,我们假设您已经熟悉 Google Protobuf(主要作
用是把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议格式等场
合。
)
,同时假设已经阅读了 caffe 中的 protobuf 定义(可以在 src/caffe/proto/caffe.proto.找到)
这个文档可以在我们建立自己的网络时,方便我们查到我们需要的格式。我们将尝试写一个 caffe 网络参数 protubuf,先观察一下传统的网络,但实际上 caffe 上的对这个网络有点改变,例如 C1 层是 20 个feature maps,第 C3 层是 50 个,C5 层是 500 个,没有 F6 层,直接是 OUTPUT 层。
这篇文章主要还是弄清楚网络定义中的这些代码的意思。
[code]#命名 name:"LeNet" #定义数据层 layer{ #输入层的名字 name:"mnist" #数据类型 type:DATA #数据参数 data_param{ #数据来源 source:"mnist-train-lmdb" #批次大小64,一次处理64条数据,其实我的机器只能处理4条 batch_size:64 #我们需要把输入像素灰度归一化,所以尺度为1/256 scale:0.00390625 } #连接data和label Blob空间 top:"data" top:"label" } #接下来是卷积层 layer{ #名称 name:"conv1" #类型 type:CONVOLUTION #这层前面使用data,后面生产conv1的Blob空间 bottom:"data" top:"conv1" #学习率调整的参数,我们设置权重学习率和运行中求解器给出的学习率一样,同样是偏置学习率的两倍 blobs_lr:1 blobs_lr:2 #卷积层的参数 convolution_param{ #输出单元数 num_output:20 #卷积核的大小5*5 kernel_size:5 #步长为1 stride:1 #网络允许我们随机初始化权重和偏置值 weight_filter{ #使用xavier算法自动确定基于输入和输出神经元数量的初始化规模 type:"xavier" } bias_filter{ #偏置值初始化为常数,默认为0 type:"constant" } } } #定义pooling层 layer{ name:"pool1" type:POOLING #这层前面使用conv1,后面生成pool1的Blob空间 bottom:"conv1" top:"pool1" pooling_param{ #pooling的方式是MAX pool:MAX kernel_size:2 tride:2 } } #第二个卷积层 layer{ name:"conv2" type:CONVOLUTION #这层前面使用pool1,后面生成conv2的Blob空间 bottom:"pool1" top:"conv2" blobs_lr:1 blobs_lr:2 convolution_param{ num_output:50 kernel_size:5 stride:1 weight_filter{ type:"xavier" } bias_filter{ type:"constant" } } } #第二个pooling层 layer{ name:"pool2" type:POOLING bottom:"conv2" top:"pool2" pooling_param{ pool:MAX kenel_size:2 stride:2 } } #全连接层 layer{ name:"ip1" type:INNER_PRODUCT blobs_lr:1 blobs_lr:2 inner_product_param{ #输出500个节点,在一定范围内节点越多正确率越高 num_output:500 weight_filter{ type:"xavier" } bias_filter{ type:"constant" } } bottom:"pool2" top:"ip1" } #ReLU层,由于是元素级的操作,我们可以利用现场激活来节省内存 layers{ name:"relu1" type:RELU bottom:"ip1" top:"ip1" } #全连接层 layers { name:"ip2" type:INNER_PRODUCT blobs_lr:1 blobs_lr:2 inner_product_param{ num_ouput:10 weight_filter{ type:"xavier" } bias_filter{ type:"constant" } } bottom:"ip1" top:"ip2" } #LOSS层,该softmax_loss层同时实现了softmax和多项Logistic损失,即节省了时间又提高了数据的稳定性。他需要两块,第一块预测,第二块提供标签。它不产生任何输出,它做的是计算损失函数值,在BP算法运行的时候使用,启动相对与ip2的梯度。 layers{ name:"loss" type:SOFTMAX_LOSS bottom:"ip2" top:"label" }
[code]#定义训练数据来源 train_net:"lenet_train_mine.prototxt" #定义检测数据来源 test_net:"lenet_test.prototxt" #训练的批次为100,迭代次数100,这样覆盖了10000张测试图片(100*100) test_iter:100 #每迭代500次测试一次 test_interval:500 #学习率,动量,权重的递减 base_lr:0.01 momentum:0.9 weight_decay:0.0005 #学习策略inv,cifar10用固定学习率,imageNet每步递减学习率 lr_policy:"inv1" gamma:0.0001 power:0.75 #每迭代100次显示一次 display:100 #最大迭代次数 max_iter:10000 #每5000次迭代存储一次数据到电脑,名字是lenet snapshot:5000 snapshot_prefix:"lenet" #0为CPU,1为GPU训练 sover_mode:1
相关文章推荐
- 产品经理的浓缩总结--转载自http://www.chanpin100.com/archives/32854
- 广州易幻网络科技有限公司Android笔面经 (未通过)
- HttpClient和HttpURLConnection的区别
- 他妈的 Python(1):怎么发起一个同步的 HTTP 请求
- 《2》IP+TCP协议的简单介绍
- http响应状态码大全
- iOS网络编程实践--蓝牙对等网络通信实例讲解
- 236,HTTP
- 《1》7层+4层网络模型
- 235,网络基础
- HttpClient教程
- [置顶] 【机器学习】神经网络-激活函数-面面观(Activation Function)
- 网络请求类NSURLConnection的使用
- TCP/IP (wireshark抓包软件)
- ios开发网络协议基础 初探
- 随笔 | Python的Flask强制使http跳转到https页面
- TCP和Http的区别!我都搞懂了,你就别迷糊了!
- TCP/IP,http,socket,长连接,短连接
- HTTP 错误种类
- CentOS修改网络参数命令