Caffe系列1——网络文件和求解分析
1. 首先,我们先看一个完整的文件:lenet_train_test.prototxt
name: "LeNet" #整个网络的名称
layer { #数据层——训练数据
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_train_lmdb"
batch_size: 64
backend: LMDB
}
} 20 #数据层-这里表示测试数据
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_test_lmdb"
batch_size: 100
backend: LMDB
}
} #第一层卷积层
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 20
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
} #第一层池化层
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
} #第二层卷积
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
} #第二层池化
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
} #第一层全连接层
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
} #第一层激活层
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
} #第二层全连接层
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 10
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
} #测试准确率层
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"
}
2. 数据层
layer {
name: "cifar" #cifar数据的名称
type: "Data"
top: "data" #一般用bottom表示输入,top表示输出,多个top代表有多个输出
top: "label" #数据输出包含两部分:图像和标签
include {
phase: TRAIN #训练网络分为训练阶段和自测试阶段,如果没写include则表示该层即在测试中,又在训练中
}
transform_param {
mean_file: "examples/cifar10/mean.binaryproto" #用一个配置文件来进行均值的操作
transform_param {
scale: 0.00390625 #归一化处理1/255,将图像的像素值归一化到0-1之间
#这里表示数据增强
mirror: 1 # 1表示开启镜像,0表示关闭,也可用ture和false来表示
# 剪裁一个 227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪
crop_size: 227
}
}
data_param {
source: "examples/cifar10/cifar10_train_lmdb" #数据库来源,也就是训练数据集所在路径
batch_size: 64 #每次批处理的个数
backend: LMDB #选用数据的类型名称
}
} ### 使用LMDB源
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_train_lmdb"
batch_size: 64
backend: LMDB
}
} ###使用HDF5数据源
layer {
name: "data"
type: "HDF5Data"
top: "data"
top: "label"
hdf5_data_param {
source: "examples/hdf5_classification/data/train.txt"
batch_size: 10
}
} ###数据直接来源与图片
#/path/to/images/img3423.jpg 2
#/path/to/images/img3424.jpg 13
#/path/to/images/img3425.jpg 8 layer {
name: "data"
type: "ImageData" #类型
top: "data"
top: "label"
transform_param {
mirror: false
crop_size: 227
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
image_data_param {
source: "examples/_temp/file_list.txt"
batch_size: 50
new_height: 256 #如果设置就对图片进行resize操作
new_width: 256
}
3. 卷积层
layer {
name: "conv1" #卷积层名称
type: "Convolution" #表示该层是卷积操作
bottom: "data" #bottom表示输入,输入的是“Data”,也就是数据层的输出。
top: "conv1" #Top表示输出,该层的输出名称就是“conv1”,它表示第一层卷积操作的输出
param {
lr_mult: 1 #lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。
}
param {
lr_mult: 2
}
convolution_param {
num_output: 20 #卷积核(filter)的个数,也就是通道数(channels)。
kernel_size: 5 #卷积核的大小
stride: 1 #卷积核的步长,默认为1
pad: 0 #扩充边缘,默认为0,不扩充
weight_filler {
type: "xavier" #权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
}
bias_filler {
type: "constant" #偏置项的初始化。一般设置为"constant",值全为0
}
}
} 输入:n*c0*w0*h0
输出:n*c1*w1*h1
其中,c1就是参数中的num_output,生成的特征图个数
w1=(w0+2*pad-kernel_size)/stride+1;
h1=(h0+2*pad-kernel_size)/stride+1;
4. 池化层(pooling layer)
layer {
name: "pool1" #池化层的名称“pool1”
type: "Pooling" #表示这一层是池化操作
bottom: "conv1" #输入来自于第一层的卷积“conv1”
top: "pool1" #输出的就是第一层池化,其名称是“pool1”
pooling_param {
pool: MAX #池化操作的方法,默认为MAX-pooling。目前可用的方法有MAX-pooling, AVE-pooling
kernel_size: 3 #池化的核大小
stride: 2 #池化的步长,默认为1。一般我们设置为2,即不重叠。
}
} #pooling层的运算方法基本是和卷积层是一样的。
5. 激活函数层
#在激活层中,对输入数据进行激活操作,是逐元素进行运算的,在运算过程中,没有改变数据的大小,即输入和输出的数据大小是相等的。 ###Sigmoid layer {
name: "test"
bottom: "conv"
top: "test"
type: "Sigmoid"
} #ReLU是目前使用最多的激活函数,主要因为其收敛更快,并且能保持同样效果。标准的ReLU函数为max(x, 0),当x>0时,输出x; 当x<=0时,输出0
f(x)=max(x,0) layer {
name: "relu1" #该层的名称“reLu1”
type: "ReLU" #这一层操作的激活函数ReLu
bottom: "pool1" #这一层数据输入是pool1
top: "pool1"
}
6. 全连接层(FC Layer)
#全连接层,输出的是一个简单向量 参数跟卷积层一样
layer {
name: "ip1" #该层的名称,叫做ip1,其实是计算向量内积的操作,也就是我们常说的全连接层
type: "InnerProduct" #这里的类型表示操作的作用是计算前后向量的内积,即全连接
bottom: "pool2" #这一层的输入来自于池化层“pool2”
top: "ip1" #输出层的名字叫做“ip1”
param {
lr_mult: 1 #这里表示权重学习率系数,还需要和基础学习率相乘
}
param {
lr_mult: 2 #这里表示偏置的学习率系数,也需要和基础学习率相乘,它一般是权重学习率系数的2倍
}
inner_product_param {
num_output: 500 #这里表示 全连接层的输出为500个神经元
weight_filler {
type: "xavier" #这里是一种权重初始化的方法
}
bias_filler { #这里表示了偏置的初始化方式
type: "constant"
}
}
}
#测试的时候输入准确率
layer {
name: "accuracy" #该层的名称是“accuracy”
type: "Accuracy" #这一层操作的作用就是计算测试集在模型上的准确率
bottom: "ip2" #这一层的输入:第二个全连接层的输出
bottom: "label" #这一层的第二个输入:一个batch_size图片的类别标签
top: "accuracy" #该层的输出的名称是“accuracy”
include {
phase: TEST #这里说明该层只在测试时起作用
}
}
7. soft-max loss层
#softmax-loss layer:输出loss值 layer {
name: "loss" #该层的名称是“loss”
type: "SoftmaxWithLoss" #这一层操作的作用是计算交叉熵损失
bottom: "ip1" #输入是全连接层的输出
bottom: "label" #输入是类别标签
top: "loss" #输出的损失,其名称是“loss”
}
#softmax layer: 输出似然值
layers {
bottom: "cls3_fc"
top: "prob"
name: "prob"
type: “Softmax"
}
7. reshape层
#在不改变数据的情况下,改变输入的维度 layer {
name: "reshape"
type: "Reshape"
bottom: "input"
top: "output"
reshape_param {
shape {
dim: 0 # copy the dimension from below
dim: 2
dim: 3
dim: -1 # infer it from the other dimensions
}
}
} 有一个可选的参数组shape, 用于指定blob数据的各维的值(blob是一个四维的数据:n*c*w*h)。 dim:0 表示维度不变,即输入和输出是相同的维度。 dim:2 或 dim:3 将原来的维度变成2或3 dim:-1 表示由系统自动计算维度。数据的总量不变,系统会根据blob数据的其它三维来自动计算当前维的维度值 。 假设原数据为:32*3*28*28, 表示32张3通道的28*28的彩色图片
shape {
dim: 0
dim: 0
dim: 14
dim: -1
}
输出数据为:32*3*14*56
#Dropout是一个防止过拟合的层,表示神经元随机失活
#只需要设置一个dropout_ratio就可以了。
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7-conv"
top: "fc7-conv"
dropout_param {
dropout_ratio: 0.5
}
}
8. solver文件解析
#往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。
#caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择。 Stochastic Gradient Descent (type: "SGD"),
AdaDelta (type: "AdaDelta"),
Adaptive Gradient (type: "AdaGrad"),
Adam (type: "Adam"),
Nesterov’s Accelerated Gradient (type: "Nesterov")
RMSprop (type: "RMSProp")
net: "examples/mnist/lenet_train_test.prototxt" #这里表示训练的网络结构文件和测试文件的路径
test_iter: 100 #这里的表示测试的时候,batch_size= 测试样本总量/test_iter
test_interval: 500 #测试间隔,表示每训练500步,进行一次测试
base_lr: 0.01 #基础的学习率
momentum: 0.9 #动量
type: SGD #优化方法选择:随机梯度下降
weight_decay: 0.0005 #权重衰减率
lr_policy: "inv" #学习率调整策略
gamma: 0.0001
power: 0.75
display: 100 #显示,每训练100步,在屏幕上显示一次。
max_iter: 20000 #最大的迭代次数20000步,到达20000次自动停止
snapshot: 5000 #每隔5000步进行一次模型输出
snapshot_prefix: "examples/mnist/lenet" #模型的保存位置
solver_mode: CPU #模型训练在CPU上进行 #详细解释如下:
net: "examples/mnist/lenet_train_test.prototxt" #网络位置
train_net: "examples/hdf5_classification/logreg_auto_train.prototxt" #也可以分别设定train和test
test_net: "examples/hdf5_classification/logreg_auto_test.prototxt"
test_iter: 100 #迭代了多少个测试样本呢? batch*test_iter 假设有5000个测试样本,一次测试想跑遍这5000个则需要设置test_iter×batch=5000 test_interval: 500 #测试间隔。也就是每训练500次,才进行一次测试。 base_lr: 0.01 #base_lr用于设置基础学习率 lr_policy: "inv" #学习率调整的策略 - fixed: #保持base_lr不变.
- step: #如果设置为step,则还需要设置一个stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
- exp: #返回base_lr * gamma ^ iter, iter为当前迭代次数
- inv: #如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
- multistep: #如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据stepvalue值变化
- poly: #学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
- sigmoid: #学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize)))) momentum :0.9 #动量 display: 100 #每训练100次,在屏幕上显示一次。如果设置为0,则不显示。 max_iter: 20000 #最大迭代次数,2W次就停止了 snapshot: 5000 #快照。将训练出来的model和solver状态进行保存,snapshot用于设置训练多少次后进行保存
snapshot_prefix: "examples/mnist/lenet" solver_mode: CPU #设置运行模式。默认为GPU,如果你没有GPU,则需要改成CPU,否则会出错。
Caffe系列1——网络文件和求解分析的更多相关文章
- Caffe源代码中Solver文件分析
Caffe源代码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/solver.hpp文件 ...
- Android系列之网络(二)----HTTP请求头与响应头
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
- # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...
- Caffe fine-tuning 微调网络
转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 目前呢,caffe,theano,torch是当下比较流行的De ...
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- Mybatis 系列2-配置文件
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
随机推荐
- bs4修改html文件和保存
一.需求 将2个html文件保存到本地浏览器,例如: A页面(我的博客主页) B页面(爬虫四大金刚) 然后将A页面中的爬虫链接,链接的a标签中的href属性修改成本地B页面的地址,实现在本地浏览A页面 ...
- NX二次开发-UFUN打开信息窗口UF_UI_open_listing_window()
NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); //方法1(uc1601) uc1601();// ...
- Css实现Div在页面上垂直居中显示
方法一 <html> <head> <title>垂直居中</title> <style type=" ...
- 买不到的数目 /// 结论公式 oj26316
题目大意: 给定a b(这题题意不清 其实a b互质) 设变量x y(x>=0,y>=0),求 x*a+y*b=c 找到最大的不可能达到的c 如a=4 b=7 那么c=14 有这样一个定理 ...
- myeclipe 中配置maven
1.配置maven 2. 2
- Red Hat Linux安装vsftpd
一.安装分区方案: (1)交换分区,两倍内存 (2)/boot分区 (3)/剩余的所有空间语言选择English(英语) 二. 配置IPIP地址.子网掩码: 编辑 /etc/sysconfig/net ...
- 机器突然宕机导致hdfs启动一直超时的行为
今天手里其中一个集群几个机器突然宕机,启动hdfs一直超时. clouder-scm-agent主要报了这个错RROR: Unexpected error 'getpwuid(): uid not f ...
- 以 Ubuntu 为例:清理 linux 系统的"垃圾"文件
clean 命令删除所有的软件安装包. 在网络连接正常的情况下,我们执行软件安装命令,软件安装结束后,以 .deb 为后缀的软件包就不再需要了.这种情况和 Windows 平台.手机的安卓平台上的情况 ...
- mysql 远程连接报错
./mysql -uzhu -p -h192.168.1.200 ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.200 ...
- Java 学习 时间格式化(SimpleDateFormat)与历法类(Calendar)用法详解
基于Android一些时间创建的基本概念 获取当前时间 方式一: Date date = new Date(); Log.e(TAG, "当前时间="+date); 结果: E/T ...