理解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原始模型

 

1

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这种上下结构,所以这里的图也采用这种方式展现出来,更加方便理解。

1

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

caffe开始训练自己的模型(转载并验证过)

学习caffe中踩了不少坑,这里我参考了此博主的文章,并体会到了如何训练自己的模型:http://www.cnblogs.com/denny402/p/5083300.html 学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中。因…

图像拼接(一):柱面投影+模板匹配+渐入渐出融合

这种拼接方法的假设前提是:待拼接的两幅图像之间的变换模型是平移模型,即两幅图像同名点位置之间只相差两个未知量:ΔxΔx 和ΔyΔy,自由度为2,模型收得最紧。所以只有所有图像都是用同一水平线或者同一已知倾斜角的摄…

图像拼接(二):OpenCV同时打开两个摄像头捕获视频

使用OpenCV实现同时打开两个USB摄像头,并实时显示视频。如果未检测有两个摄像头,程序会结束并发出“摄像头未安装好”的警告。这里推荐一个小巧的摄像头视频捕捉软件:amcap,使用它可以方便的检查每个摄像头是否能正常工作。 捕获…

elasticsearch的Linux下安装报错问题解决

1.启动报错如下: vim /etc/security/limits.conf 然后修改如下 * soft nofile 65536 * hard nofile 65536sudo vi /etc/pam.d/common-session 添加 session required pam_limits.so sudo vi /etc/pam.d/common-session-noninteractive 添加 session required pam_limits.so…

Fiddler抓包工具使用

先下载Fiddler 欢迎关注我的新微信公众号 ipgame,有什么问题可以提供交流的平台,欢迎大家讨论。 电脑最好是笔记本,这样能和手机保持统一局域网内;其他不多说,直接说步骤了。 一.对PC(笔记本&#xff0…

Tensorboard--模型可视化工具

Tensorboard1.tensorboard in tensorflow1.1 tensorboard的启动过程1.2 tf.summary 可视化类型1.3 tf.summary 使用demo2.tensorboard in pytorch2.1 SummaryWriter 使用demo12.2 tSummaryWriter 使用demo22.3 tensorboard 数据再读取tensorboard in tensorflow :te…

opencv findContours 报错_acrt_first_block == header

报错_acrt_first_block header 之前一直使用OpenCV3.3VS2015 void AOIAlgorithm::findUnits(Mat& blkGray, vector<vector<cv::Point>> & blkContours) {Mat blkOBW;blur(blkGray, blkGray, cv::Size(5, 5));threshold(blkGray, blkOBW, 0, 255, CV_THR…

TensorFlow(2)-训练数据载入

tensorflow 训练数据载入1. tf.data.Dataset2. dataset 创建数据集的方式2.1 tf.data.Dataset.from_tensor_slices()2.2 tf.data.TextLineDataset()2.3 tf.data.FixedLengthRecordDataset()2.4 tf.data.TFRecordDataset()3. dateset 迭代操作iterator3.1 make_one_shot_iterato…

leetcode14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar",&quo…

Android在子线程里使用Toast报错Can't toast on a thread that has not called Looper.prepare()

在接android SDK的时候有时候为了方便debug调试查看&#xff0c;通过Toast输出相关信息&#xff0c; 实际上这个是在子线程中输出的&#xff0c;在logcat里查看有如下报错java.lang.RuntimeException: Cant toast on a thread that has not called Looper.prepare()。 解决办法…

虚拟机安装windows2012和虚拟机安装国产系统deepin

虚拟机安装windows2012和虚拟机安装国产系统deepin 一.安装windows20121.安装VMWare虚拟机2.1.注意点一&#xff1a;VMWare虚拟网卡2.2.注意点二&#xff1a;配置虚拟网络编辑器3.安装配置Windows Server 2012 R2 二.虚拟机安装deepin1.deepin官网下载ios镜像2.deepin下载合适的…

leetcode876 链表中间的结点

给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;[1,2,3,4,5] 输出&#xff1a;此列表中的结点 3 (序列化形式&#xff1a;[3,4,5]) 返回的结点值为 3 。 …

PlayFab(二)如何通过Demo应用来进一步熟悉Playfab

有时候刚开始接触新的平台会两眼一麻黑,不过这个文章希望能给读者一些启示,Playfab默认会给开发者提供一个应用,这里我暂且叫他”我的游戏“; 我通过官网提供的DEMO测试地址: https://www.vanguardoutrider.com/#/ 来为该应用配置服务器。 如果你是第一次进入这个页面想为…

leetcode718 最长重复子数组

给两个整数数组 A 和 B &#xff0c;返回两个数组中公共的、长度最长的子数组的长度。 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。 说明: 1 < len(A), len(B) < 1000 0 < A[i], B[i] < 100 思路&#xf…

leetcode108 将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组&#xff0c;转换为一棵高度平衡二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是&#xff1a;[0,-3,9,-10,null,…

MachineLearning(12)- RNN-LSTM-tf.nn.rnn_cell

RNN-LSTM1.RNN2.LSTM3. tensorflow 中的RNN-LSTM3.1 tf.nn.rnn_cell.BasicRNNCell()3.2 tf.nn.rnn_cell.BasicLSTMCell()3.3 tf.nn.dynamic_rnn()--多步执行循环神经网络1.RNN RNN-Recurrent Neural Network-循环神经网络 RNN用来处理序列数据。多层感知机MLP层间节点全联接&…

AWS的VPC使用经验(二)

上文说了如何创建自定义VPC网络的EC2实例&#xff0c;这节说如何在多个VPC之间创建对等连接。 这里分别填写自己的VPC和对方的VPC的ID信息&#xff0c;然后在对方的VPC里就能看到有连接请求&#xff0c;在对方的连接请求里选择 “操作”->接受。 到这里已经快要收尾了&…

ubuntu nginx配置负载均衡篇(一)

Nginx 代理服务的配置说明 1、设置 404 页面导向地址 error_page 404 https://www.runnob.com; #错误页 proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。 2、如果我们的代理只允许接受get,post请求…

坦克大战

效果 map.js var map4 [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,2,2,0,0,2,2,0,0,0,2,2,0,0,2,2,0,0,2,2,0,2,2,0],[0,2,2,0,0,2,2,0,0,0,2,2,3,3,2,2…

windows安装 MySQL5.7服务端

1,安装https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.30-winx64.zip mysql安装包。 2. 自己配置my.ini [client] port=3306 [mysql] default-character-set=utf8[mysqld] character-set-server=utf8 port=3306 basedir="D:/mysql-5.7.30-winx64/" datad…