Caffe篇--Caffe从入门到初始及各层介绍
Posted lhworldblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Caffe篇--Caffe从入门到初始及各层介绍相关的知识,希望对你有一定的参考价值。
一、前述
Caffe,全称Convolutional Architecture for Fast Feature Embedding。是一种常用的深度学习框架,主要应用在视频、图像处理方面的应用上。caffe是一个清晰,可读性高,快速的深度学习框架。作者是贾扬清,加州大学伯克利的ph.D,现就职于Facebook。caffe的官网是http://caffe.berkeleyvision.org/。
二、具体
1、输入层
layer { name: "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 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 } }
2、卷积层
layer { name: "conv1" #定义一个名字 必须指定的 type: "Convolution" bottom: "data"#前面连接的层 data层 top: "conv1"#输出是卷积层 param { lr_mult: 1 #lr_mult: #当前层的学习率 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。 } param { lr_mult: 2 } convolution_param { num_output: 20 #卷积核(filter)的个数等于特征图的个数 kernel_size: 5 #卷积核的大小 5*5*d 中的d是上一层的深度 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;
结论:
假设输入时h*w k是kernel_size p 是padding s是stride则
特征图 的输出的h是多大的 (h-k+2p)/s+1
w是(w-k+2p)/s+1
3、池化层
layer { name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { pool: MAX #池化方法,默认为MAX。目前可用的方法有MAX, AVE kernel_size: 3 #池化的核大小 stride: 2 #池化的步长,默认为1。一般我们设置为2,即不重叠。 } } #pooling层的运算方法基本是和卷积层是一样的。
4、激活函数层
#在激活层中,对输入数据进行激活操作,是逐元素进行运算的,在运算过程中,没有改变数据的大小,即输入和输出的数据大小是相等的。 ###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" type: "ReLU" bottom: "pool1" top: "pool1" }
5、全连接层
#全连接层,输出的是一个简单向量 参数跟卷积层一样 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: "accuracy" type: "Accuracy" bottom: "ip2"#两个输入一个输入是分类结果 bottom: "label"#另一个输入是label top: "accuracy" include { phase: TEST } }
6、softmax_layer
#softmax-loss layer:输出loss值 对于softmax 得到损失函数 -logp p为正确的分类的概率 layer { name: "loss" type: "SoftmaxWithLoss" bottom: "ip1" bottom: "label" top: "loss" } #softmax layer: 输出似然值 得到每一个类别的概率值 layers { bottom: "cls3_fc" top: "prob" name: "prob" type: “Softmax" }