欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 人工智能 > caffe >内容正文

caffe

理解caffe的网络模型 -凯发k8官方网

发布时间:2023/12/13 caffe 84 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 理解caffe的网络模型 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录

  • 1. 初见lenet原始模型
  • 2. caffe lenet的网络结构
  • 3. 逐层理解caffe lenet
    • 3.1 data layer
    • 3.2 conv1 layer
    • 3.3 pool1 layer
    • 3.4 conv2 layer
    • 3.5 pool2 layer
    • 3.6 ip1 layer
    • 3.7 relu1 layer
    • 3.8 ip2 layer
    • 3.9 loss layer

1. 初见lenet原始模型

 

fig.1. architecture of original lenet-5.

图片来源: lecun, et al., gradient-based learning applied to document recognition, p ieee, vol. 86, no. 11, 1998, pp. 2278-2324.

在这篇图片的论文中,详细描述了lenet-5的结构。

这里不对lenet-5原始模型进行讨论。可以参考这些资料:

http://blog.csdn.net/qiaofangjie/article/details/16826849

http://blog.csdn.net/xuanyuansen/article/details/41800721

回到顶部(go to top)

2. caffe lenet的网络结构

他山之石,可以攻玉。本来是准备画出caffe lenet的图的,但发现已经有人做了,并且画的很好,就直接拿过来辅助理解了。

第3部分图片来源:http://www.2cto.com/kf/201606/518254.html

先从整体上感知caffe lenet的拓扑图,由于caffe中定义网络的结构采用的是bottom&top这种上下结构,所以这里的图也采用这种方式展现出来,更加方便理解。

fig.2. architecture of caffe lenet.

from bottom to top: data layer, conv1, pool1, conv2, pool2, ip1, relu1, ip2, [accuracy]loss.

本节接下来将按照这个顺序依次理解caffe lenet的网络结构。

3. 逐层理解caffe lenet 本节将采用定义与图解想结合的方式逐层理解caffe lenet的结构。3.1 data layer #==============定义train的数据层============================================ layer { name: "mnist" #定义该层的名字type: "data" #该层的类型是数据top: "data" #该层生成一个data blobtop: "label" #该层生成一个label blobinclude {phase: train #说明该层只在train阶段使用}transform_param {scale: 0.00390625 #数据归一化系数,1/256,归一到[0,1)}data_param {source: "e:/mycode/dl/caffe-master/examples/mnist/mnist_train_lmdb" #训练数据的路径batch_size: 64 #批量处理的大小backend: lmdb} } #==============定义test的数据层============================================ layer { name: "mnist"type: "data"top: "data"top: "label"include {phase: test #说明该层只在test阶段使用}transform_param {scale: 0.00390625}data_param {source: "e:/mycode/dl/caffe-master/examples/mnist/mnist_test_lmdb" #测试数据的路径batch_size: 100backend: lmdb} } 2fig.3. architecture of data layer.fig.3 是train情况下,数据层读取lmdb数据,每次读取64条数据,即n=64。caffe中采用4d表示,n*c*h*w(num*channels*height*width)。3.2 conv1 layer #==============定义卷积层1============================= layer {name: "conv1" #该层的名字conv1,即卷积层1type: "convolution" #该层的类型是卷积层bottom: "data" #该层使用的数据是由数据层提供的data blobtop: "conv1" #该层生成的数据是conv1param {lr_mult: 1 #weight learning rate(简写为lr)权值的学习率,1表示该值是lenet_solver.prototxt中base_lr: 0.01的1倍}param {lr_mult: 2 #bias learning rate偏移值的学习率,2表示该值是lenet_solver.prototxt中base_lr: 0.01的2倍}convolution_param {num_output: 20 #产生20个输出通道kernel_size: 5 #卷积核的大小为5*5stride: 1 #卷积核移动的步幅为1weight_filler {type: "xavier" #xavier算法,根据输入和输出的神经元的个数自动初始化权值比例}bias_filler {type: "constant" #将偏移值初始化为“稳定”状态,即设为默认值0}} } 3fig.4. architecture of conv1 layer.conv1的数据变化的情况:batch_size*1*28*28->batch_size*20*24*243.3 pool1 layer #==============定义池化层1============================= layer {name: "pool1"type: "pooling"bottom: "conv1" #该层使用的数据是由conv1层提供的conv1top: "pool1" #该层生成的数据是pool1pooling_param {pool: max #采用最大值池化kernel_size: 2 #池化核大小为2*2stride: 2 #池化核移动的步幅为2,即非重叠移动} } 4fig.5. architecture of pool1 layer.池化层1过程数据变化:batch_size*20*24*24->batch_size*20*12*123.4 conv2 layer #==============定义卷积层2============================= layer {name: "conv2"type: "convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}} } conv2层的图与fig.4 类似,卷积层2过程数据变化:batch_size*20*12*12->batch_size*50*8*8。3.5 pool2 layer #==============定义池化层2============================= layer {name: "pool2"type: "pooling"bottom: "conv2"top: "pool2"pooling_param {pool: maxkernel_size: 2stride: 2} } pool2层图与fig.5类似,池化层2过程数据变化:batch_size*50*8*8->batch_size*50*4*4。3.6 ip1 layer #==============定义全连接层1============================= layer {name: "ip1"type: "innerproduct" #该层的类型为全连接层bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500 #有500个输出通道weight_filler {type: "xavier"}bias_filler {type: "constant"}} } 5fig.6. architecture of ip11 layer.ip1过程数据变化:batch_size*50*4*4->batch_size*500*1*1。此处的全连接是将c*h*w转换成1d feature vector,即800->500.3.7 relu1 layer #==============定义relu1层============================= layer {name: "relu1"type: "relu"bottom: "ip1"top: "ip1" } 6 fig.7. architecture of relu1 layer. relu1层过程数据变化:batch_size*500*1*1->batch_size*500*1*13.8 ip2 layer #==============定义全连接层2============================ layer {name: "ip2"type: "innerproduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10 #10个输出数据,对应0-9十个数字weight_filler {type: "xavier"}bias_filler {type: "constant"}} } ip2过程数据变化:batch_size*500*1*1->batch_size*10*1*13.9 loss layer #==============定义损失函数层============================ layer {name: "loss"type: "softmaxwithloss"bottom: "ip2"bottom: "label"top: "loss" } 7fig.8. architecture of loss layer.损失层过程数据变化:batch_size*10*1*1->batch_size*10*1*1note:注意到caffe lenet中有一个accuracy layer的定义,这是输出测试结果的层。回到顶部(go to top) 4. caffe lenet的完整定义 name: "lenet" #定义网络的名字 #==============定义train的数据层============================================ layer { name: "mnist" #定义该层的名字type: "data" #该层的类型是数据top: "data" #该层生成一个data blobtop: "label" #该层生成一个label blobinclude {phase: train #说明该层只在train阶段使用}transform_param {scale: 0.00390625 #数据归一化系数,1/256,归一到[0,1)}data_param {source: "e:/mycode/dl/caffe-master/examples/mnist/mnist_train_lmdb" #训练数据的路径batch_size: 64 #批量处理的大小backend: lmdb} } #==============定义test的数据层============================================ layer { name: "mnist"type: "data"top: "data"top: "label"include {phase: test #说明该层只在test阶段使用}transform_param {scale: 0.00390625}data_param {source: "e:/mycode/dl/caffe-master/examples/mnist/mnist_test_lmdb" #测试数据的路径batch_size: 100backend: lmdb} } #==============定义卷积层1============================= layer {name: "conv1" #该层的名字conv1,即卷积层1type: "convolution" #该层的类型是卷积层bottom: "data" #该层使用的数据是由数据层提供的data blobtop: "conv1" #该层生成的数据是conv1param {lr_mult: 1 #weight learning rate(简写为lr)权值的学习率,1表示该值是lenet_solver.prototxt中base_lr: 0.01的1倍}param {lr_mult: 2 #bias learning rate偏移值的学习率,2表示该值是lenet_solver.prototxt中base_lr: 0.01的2倍}convolution_param {num_output: 20 #产生20个输出通道kernel_size: 5 #卷积核的大小为5*5stride: 1 #卷积核移动的步幅为1weight_filler {type: "xavier" #xavier算法,根据输入和输出的神经元的个数自动初始化权值比例}bias_filler {type: "constant" #将偏移值初始化为“稳定”状态,即设为默认值0}} }#卷积过程数据变化:batch_size*1*28*28->batch_size*20*24*24 #==============定义池化层1============================= layer {name: "pool1"type: "pooling"bottom: "conv1" #该层使用的数据是由conv1层提供的conv1top: "pool1" #该层生成的数据是pool1pooling_param {pool: max #采用最大值池化kernel_size: 2 #池化核大小为2*2stride: 2 #池化核移动的步幅为2,即非重叠移动} }#池化层1过程数据变化:batch_size*20*24*24->batch_size*20*12*12 #==============定义卷积层2============================= layer {name: "conv2"type: "convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}} }#卷积层2过程数据变化:batch_size*20*12*12->batch_size*50*8*8 #==============定义池化层2============================= layer {name: "pool2"type: "pooling"bottom: "conv2"top: "pool2"pooling_param {pool: maxkernel_size: 2stride: 2} }#池化层2过程数据变化:batch_size*50*8*8->batch_size*50*4*4 #==============定义全连接层1============================= layer {name: "ip1"type: "innerproduct" #该层的类型为全连接层bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500 #有500个输出通道weight_filler {type: "xavier"}bias_filler {type: "constant"}} }#全连接层1过程数据变化:batch_size*50*4*4->batch_size*500*1*1 #==============定义relu1层============================= layer {name: "relu1"type: "relu"bottom: "ip1"top: "ip1" }#relu1层过程数据变化:batch_size*500*1*1->batch_size*500*1*1 #==============定义全连接层2============================ layer {name: "ip2"type: "innerproduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10 #10个输出数据,对应0-9十个数字weight_filler {type: "xavier"}bias_filler {type: "constant"}} }#全连接层2过程数据变化:batch_size*500*1*1->batch_size*10*1*1 #==============定义显示准确率结果层============================ 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" }#损失层过程数据变化:batch_size*10*1*1->batch_size*10*1*1

 

总结

以上是凯发k8官方网为你收集整理的理解caffe的网络模型的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图