caffe在 .\examples\mnist文件夹下有一个 lenet.prototxt文件,这个文件定义了一个广义的LetNet-5模型,对这个模型文件逐段分解一下。

name: "LeNet"   //网络的名称是LeNet
layer { //定义一个网络层
name: "data" //定义该网络层的名称为 data
type: "Input" //定义网络层的类型是 输入层
top: "data" //定义网络层的输出名称为data
//定义该网络层的训练参数
input_param { //如果同时读取过多张图片进行训练,训练耗时比较久
//所以CNN中分组读入训练图片
//shape中第一个参数定义每组中包含图片数量
//第二个参数定义组数
//第三和第四个参数定义图片大小 //定义读取数据维度是: 64 1 28 28
shape: { dim: 64 dim: 1 dim: 28 dim: 28 }
}
} //第一卷积层定义
layer { //定义一个网络层
name: "conv1" //网络层的名称是conv1
type: "Convolution" //网络层的类型是 卷积层 //模型结构图有两种常用画法,一种是从左到右,一种是从下到上
//caffe中使用从下到上画法,所以“bottom”表示的是上一层(输入层) bottom: "data" //网络层的输入层是 data层 //同理,输出层在上,“top”表示输出 top: "conv1" //该层的输出层名称为conv1 //param定义权重和偏置的学习率,学习率大,迭代速度快,但是容易找不到最优解
//学习率小,迭代速度慢,耗时久
//如果有两个lr_mult参数,第一个表示权重(卷积核)的学习率系数,第二个表示偏置的学习率系数
//lr_mult定义的只是学习率系数,最终的值需要乘以solver.prototxt配置文件中配置的base_lr的值
//一般偏置的学习率系数是权重学习率系数的2倍 param {
lr_mult: 1 //该层权重学习率的系数为1
}
param {
lr_mult: 2 //该层偏置学习率的系数为2
}
//卷积操作的参数设置
convolution_param {
num_output: 20 //卷积输出特征图的数量为20
kernel_size: 5 //卷积核的大小是5*5
stride: 1 //卷积操作的步长是1,即卷积核逐个移动
weight_filler {
type: "xavier" //卷积核参数采用xavier方法初始化
}
bias_filler {
type: "constant" //偏置初始值为0
}
}
} //卷积完成之后,数据的维度变成 64 20 24 24 //第一池化层定义
layer {
name: "pool1" //网络层的名称是pool1
type: "Pooling" //网络层的类型是池化层
bottom: "conv1" //网络层的输入时conv1(第一卷积层)
top: "pool1" //网络层的输出名称是 pool1 //池化操作的参数设置
pooling_param {
pool: MAX //最大值池化
kernel_size: 2 //池化核尺寸 是2*2
stride: 2 //池化步长是2
}
} //第一池化完成之后,数据的维度变成 64 20 12 12 //第二卷积层定义
layer {
name: "conv2" //网络层的名称是conv2
type: "Convolution" //网络层的类型是卷积层
bottom: "pool1" //网络层的输入时 pool1(第一池化层)
top: "conv2" //网络层的输出名称是 conv2
param {
lr_mult: 1 //卷积核的学习率系数是1
}
param {
lr_mult: 2 //偏置的学习率系数是2
} //第二卷积层参数设置
convolution_param {
num_output: 50 //输出特征图的数量
kernel_size: 5 //卷积核的尺寸是5*5
stride: 1 //卷积操作步长是1
weight_filler {
type: "xavier" //卷积核参数采用xavier方法初始化
}
bias_filler {
type: "constant" //偏置初始值为0
}
}
} //第二卷积操作完成之后,数据维度是 64 50 8 8 //第二池化层
layer {
name: "pool2" //网络层的名称是 pool2
type: "Pooling" //网络层的类型是池化层
bottom: "conv2" //网络层的输入时 conv2(第二卷积层)
top: "pool2" //网络层的输出名称是 pool2
pooling_param {
pool: MAX //池化方式是最大值池化
kernel_size: 2 //池化核大小是2*2
stride: 2 //池化步长是2
}
} //第二池化层完成之后,数据维度是 64 50 4 4 //第一层全连接层定义
layer {
name: "ip1" //网络层的名称是ip1
type: "InnerProduct" //网络层的类型是 全连接层
bottom: "pool2" //网络层的输入时 pool2(第二池化层)
top: "ip1" //网络层的输出名称是ip1
param {
lr_mult: 1 //卷积核的学习率系数是1
}
param {
lr_mult: 2 //偏置的学习率系数是2
} //第一全连接层参数设置
inner_product_param {
num_output: 500 //输出向量维度,500个输出神经元
weight_filler {
type: "xavier" //卷积核参数采用xavier方法初始化
}
bias_filler {
type: "constant" //偏置初始值为0
}
}
} //第一全连接层完成之后数据的维度是 1 500 1 1 //激活函数层的定义
layer {
name: "relu1" //网络层的名称是relu1
type: "ReLU" //网络层的类型是ReLU激活函数
bottom: "ip1" //网络层的输入时ip1(第一全连接层)
top: "ip1" //网络层的输出名称是 ip1,跟输入名称一样
} //激活层完成之后,数据的维度是 1 500 1 1 //第二全连接层定义
//数据的分类判断在本层完成
layer {
name: "ip2" //网络层的名称是 ip2
type: "InnerProduct" //网络层的类型是全连接层
bottom: "ip1" //网络层的输入时 ip1(激活函数层)
top: "ip2" //网络层的输出名称是 ip2
param {
lr_mult: 1 //卷积核的学习率系数是1
}
param {
lr_mult: 2 //偏置的学习率系数是2
} //第二全连接层参数设置
inner_product_param {
num_output: 10 //输出维度是10,分别是0~9的数字
weight_filler {
type: "xavier" //卷积核参数采用xavier方法初始化
}
bias_filler {
type: "constant" //偏置初始值为0
}
}
} //第二全连接层完成之后,数据的维度是 1 10 1 1 //输出层定义
layer {
name: "prob" //网络的名称是 prob
type: "Softmax" //网络的类型是损失函数
bottom: "ip2" //网络的输入是 ip2(第二全连接层)
top: "prob" //网络的输出名称是 prob
}

lenet.prototxt模型可视化,可以作为对比:

caffe中LetNet-5卷积神经网络模型文件lenet.prototxt理解的更多相关文章

  1. 使用PyTorch简单实现卷积神经网络模型

    这里我们会用 Python 实现三个简单的卷积神经网络模型:LeNet .AlexNet .VGGNet,首先我们需要了解三大基础数据集:MNIST 数据集.Cifar 数据集和 ImageNet 数 ...

  2. CNN-1: LeNet-5 卷积神经网络模型

    1.LeNet-5模型简介 LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 Gradient-based learning applied to document      ...

  3. 手写数字识别 ----卷积神经网络模型官方案例注释(基于Tensorflow,Python)

    # 手写数字识别 ----卷积神经网络模型 import os import tensorflow as tf #部分注释来源于 # http://www.cnblogs.com/rgvb178/p/ ...

  4. 利用Tensorflow实现卷积神经网络模型

    首先看一下卷积神经网络模型,如下图: 卷积神经网络(CNN)由输入层.卷积层.激活函数.池化层.全连接层组成,即INPUT-CONV-RELU-POOL-FC池化层:为了减少运算量和数据维度而设置的一 ...

  5. 【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型

    初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构 ...

  6. CNN-4: GoogLeNet 卷积神经网络模型

    1.GoogLeNet 模型简介 GoogLeNet 是2014年Christian Szegedy提出的一种全新的深度学习结构,该模型获得了ImageNet挑战赛的冠军. 2.GoogLeNet 模 ...

  7. CNN-2: AlexNet 卷积神经网络模型

    1.AlexNet 模型简介 由于受到计算机性能的影响,虽然LeNet在图像分类中取得了较好的成绩,但是并没有引起很多的关注. 知道2012年,Alex等人提出的AlexNet网络在ImageNet大 ...

  8. CNN-3: VGGNet 卷积神经网络模型

    1.VGGNet 模型简介 VGG Net由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind公司的研究员一起研发的的深度卷积神经网络,在 ILSVR ...

  9. 吴裕雄--天生自然python Google深度学习框架:经典卷积神经网络模型

    import tensorflow as tf INPUT_NODE = 784 OUTPUT_NODE = 10 IMAGE_SIZE = 28 NUM_CHANNELS = 1 NUM_LABEL ...

随机推荐

  1. Android自己定义控件系列三:自己定义开关button(二)

    接上一篇自己定义开关button(一)的内容继续.上一次实现了一个开关button的基本功能.即自己定义了一个控件.开关button,实现了点击切换开关状态的功能.今天我们想在此基础之上.进一步实现触 ...

  2. Bitcoin学习篇之---PPS和PPLNS挖矿模式介绍

    PPS和PPLNS挖矿模式介绍 比特币每10分钟产生一个区块,会有千万人竞争.而这个区块终于仅仅归1个人全部.其他人都颗粒无收. 你或许要挖5年才干获得一个区块. 组队挖矿就是.一旦队伍里不论什么人获 ...

  3. Java中Array、List、Set、Map

    一.Java中数组 数组用来存放固定数量的同类元素,声明方法: T[] ref,T ref[],如int[] intAry; int intAry[].推荐用T[]的方式,后一种方式为兼容C++习惯写 ...

  4. 切换JDK版本quick

    最近遇到一个小问题,同时做两个项目,jdk版本一个是5,一个是6,我也去网上找了找方法,但是感觉不是特别好用,最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击,输入一个数字回 ...

  5. BZOJ 1369 树形DP

    思路: f[i][j] 表示节点i 染成j时 子树的最小权值 (我会猜这个j很小 你打我吖~) 随便DP一发就好了 (证明我也不会) //By SiriusRen #include <cstdi ...

  6. WPF MVVM 从Prism中学习设计模式之Event Aggregator 模式

    Prism简介 Prism是由微软Patterns & Practices团队开发的项目,目的在于帮助开发人员构建松散耦合的.更灵活.更易于维护并且更易于测试的WPF应用或是Silverlig ...

  7. JavaScript系列--浅析原型链与继承

    一.前言 继承是面向对象(OOP)语言中的一个最为人津津乐道的概念.许多面对对象(OOP)语言都支持两种继承方式::接口继承 和 实现继承 . 接口继承只继承方法签名,而实现继承则继承实际的方法.由于 ...

  8. 又一个设计工具 Framer X Preview

    又一个设计工具 Framer X Preview 所说比 Sketch 和 Figma 都要好用,不知道是不是真的 ~~ To give you a little background, I've b ...

  9. javascript中菜单栏切换案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 动态修改SeekBar的颜色

    方法一 1. 需求:需要改变其默认颜色,样式 2.滑竿样式 seekbar.xml <?xml version="1.0" encoding="utf-8" ...