【原文:https://yufeigan.github.io/2014/12/09/Caffe%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B03-Layer%E7%9A%84%E7%9B%B8%E5%85%B3%E5%AD%A6%E4%B9%A0/】
Layer是所有层的基类,在Layer的基础上衍生出来的有5种Layers:
它们都有对应的[.hpp .cpp]文件声明和实现了各个类的接口。下面一个一个地讲这5个Layer。
先看data_layer.hpp中头文件调用情况:
1 |
#include "boost/scoped_ptr.hpp" |
不难看出data_layer主要包含与数据有关的文件。在官方文档中指出data是caffe数据的入口是网络的最低层,并且支持多种格式,在这之中又有5种LayerType:
DATA
MEMORY_DATA
HDF5_DATA
HDF5_OUTPUT
IMAGE_DATA
其实还有两种WINDOW_DATA
, DUMMY_DATA
用于测试和预留的接口,这里暂时不管。
1 |
template <typename Dtype> |
用于LevelDB或LMDB数据格式的输入的类型,输入参数有source
, batch_size
, (rand_skip
), (backend
)。后两个是可选。
1 |
template <typename Dtype> |
这种类型可以直接从内存读取数据使用时需要调用MemoryDataLayer::Reset
,输入参数有batch_size
,channels
, height
, width
。
1 |
template <typename Dtype> |
HDF5数据格式输入的类型,输入参数有source
, batch_size
。
1 |
template <typename Dtype> |
HDF5数据格式输出的类型,输入参数有file_name
。
1 |
template <typename Dtype> |
图像格式数据输入的类型,输入参数有source
, batch_size
, (rand_skip
), (shuffle
), (new_height
), (new_width
)。
先看neuron_layer.hpp中头文件调用情况
1 |
#include "caffe/blob.hpp" |
同样是数据的操作层,neuron_layer实现里大量激活函数,主要是元素级别的操作,具有相同的bottom
,top
size。
Caffe中实现了大量激活函数GPU和CPU的都有很多。它们的父类都是NeuronLayer
1 |
template <typename Dtype> |
这部分目前没什么需要深究的地方值得注意的是一般的参数设置格式如下(以ReLU为例):
1 |
layers { |
Loss层计算网络误差,loss_layer.hpp头文件调用情况:
1 |
#include "caffe/blob.hpp" |
可以看见调用了neuron_layers.hpp
,估计是需要调用里面的函数计算Loss,一般来说Loss放在最后一层。caffe实现了大量loss function,它们的父类都是LossLayer
。
1 |
template <typename Dtype> |
先看common_layer.hpp头文件调用:
1 |
#include "caffe/blob.hpp" |
用到了前面提到的data_layers.hpp
, loss_layers.hpp
, neuron_layers.hpp
说明这一层肯定开始有复杂的操作了。
这一层主要进行的是vision_layer
的连接
声明了9个类型的common_layer,部分有GPU实现:
InnerProductLayer
SplitLayer
FlattenLayer
ConcatLayer
SilenceLayer
EltwiseLayer
SoftmaxLayer
ArgMaxLayer
MVNLayer
常常用来作为全连接层,设置格式为:
1 |
layers { |
用于一输入对多输出的场合(对blob)
将n * c * h * w变成向量的格式n * ( c * h * w ) * 1 * 1
用于多输入一输出的场合。
1 |
layers { |
用于一输入对多输出的场合(对layer)
EltwiseLayer
, SoftmaxLayer
, ArgMaxLayer
, MVNLayer
头文件包含前面所有文件,也就是说包含了最复杂的操作。
1 |
#include "caffe/blob.hpp" |
它主要是实现Convolution和Pooling操作。主要有以下几个类。
1 |
template <typename Dtype> |
最常用的卷积操作,设置格式如下
1 |
layers { |
与MATLAB里面的im2col类似,即image-to-column transformation,转换后方便卷积计算
全称local response normalization layer,在Hinton论文中有详细介绍ImageNet Classification with Deep Convolutional Neural Networks 。
即Pooling操作,格式:
1 |
layers { |