Caffe目录结构:核心代码在caffe/src/caffe
*net.cpp:定义网络,整个网络中含有很多layers. net.cpp负责计算整个网络在训练中的forward\backward过程,也就是计算各个层
的gradient
一个典型的net开始于datalayer(从磁盘中加载数据),终止于losslayer(计算目标函数)
*layers文件夹:各种层的定义,在protobuffer中调用时包含name,type(data,conv,pool...),connectionstructure(input blobs and out
blobs),layer-spectific parameters(如conv的kernel大小)。定义一个layer需要定义其
setup\在模型初始化时重置layers及其相互之间的关系
forward\从bottom层接受数据,进行计算后将输出送入top层中
backward\给定相对于top层输出的梯度,计算其相对于输入的梯度并传递到bottom
前向和后向函数分别有GPU和CPU两种实现方式。如果没有实现gpu版本,那么layer讲转向作为备用选项的cpu方式。尽管这样会增加
额外的数据传输成本(输入数据由gpu复制到cpu上,之后输出数据从cpu复制到gpu上),但是对于做一些快速的实验这还是很方便
1.Convolution:必填项:1.num_output:指定卷积核的数量
2.kernel_size:指定卷积核的高度和宽度
强烈推荐:weight_filter:指定参数的初始化方案,默认为常数0
可选项:1.bais_term:指定是否给卷积输出添加偏置项,默认是
2.pad:指定在输入图像周围补0的像素个数
3.stride:指定卷集合在输入图像上的滑动步长
4.group;指定分组卷积操作的组数,默认为1不分组,如果g大于1,可以将卷积核的连接限制为输入数据的一个子集
layer{
name=”conv1”
type=”Convolution”
bottom=”data”
top=”conv1”
param{lr_mult:1decay_mult:1}
param{lr_mult:2decay_mult:0}
convolution_param{
num_output:96
kernel_size:11
stride:4
weight_filter{
type:”gaussian”
std:0.01
}
bias_filter{
type:”constant”
value:0
}
}
}
2.Pooling :必填项:1.kernel_size:指定卷积核的高度和宽度
可选项:1.pool:池化方法默认MAX有三种选择最大值,均值和随机池化
2.pad:指定在输入图像周围补0的像素个数
3.stride:指定卷集合在输入图像上的滑动步长
layer{