您的位置:首页 > 理论基础 > 计算机网络

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

2016-01-27 14:10 513 查看
参照薛开宇的学习笔记学习,全文几乎是跟着他的方法走的,只是贴出自己的一些错误和不同的地方。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: