学习搭建自己的网络MNIST在caffe上训练学习

来源:互联网 发布:网络安全管理指导思想 编辑:程序博客网 时间:2024/05/22 05:22

参照薛开宇的学习笔记学习,全文几乎是跟着他的方法走的,只是贴出自己的一些错误和不同的地方。
1 准备数据库:MNST手写字体库

./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 层。
这里写图片描述这篇文章主要还是弄清楚网络定义中的这些代码的意思。

#命名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:1blobs_lr:2convolution_param{     num_output:50     kernel_size:5     stride:1     weight_filter{        type:"xavier"     }     bias_filter{        type:"constant"     }     }}#第二个pooling层layer{name:"pool2"type:POOLINGbottom:"conv2"top:"pool2"pooling_param{    pool:MAX    kenel_size:2    stride:2  }}#全连接层layer{name:"ip1"type:INNER_PRODUCTblobs_lr:1blobs_lr:2inner_product_param{#输出500个节点,在一定范围内节点越多正确率越高     num_output:500     weight_filter{        type:"xavier"     }     bias_filter{     type:"constant"     }   }bottom:"pool2"top:"ip1"}#ReLU层,由于是元素级的操作,我们可以利用现场激活来节省内存layers{name:"relu1"type:RELUbottom:"ip1"top:"ip1"}#全连接层layers{name:"ip2"type:INNER_PRODUCTblobs_lr:1blobs_lr:2inner_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_LOSSbottom:"ip2"top:"label"}
#定义训练数据来源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.01momentum:0.9weight_decay:0.0005#学习策略inv,cifar10用固定学习率,imageNet每步递减学习率lr_policy:"inv1"gamma:0.0001power:0.75#每迭代100次显示一次display:100#最大迭代次数max_iter:10000#每5000次迭代存储一次数据到电脑,名字是lenetsnapshot:5000snapshot_prefix:"lenet"#0为CPU,1为GPU训练sover_mode:1
0 0
原创粉丝点击