(一)前 言
上一节我们尝试着自定义卷积神经网络,然后对MNIST数据集进行了学习,效果还是很不错的,训练速度也很快,不愧是C++写的框架,我只能说:
这一节来好好说道说道卷积层和池化层的定义,毕竟是基础中的基础
(二)卷积层
首先来看卷积层,如下所示:
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
convolution_param {
num_output: 20
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
- name: 卷积层的名字,随便写
- type: 层类型,这写上"Convolution"表示是卷积层
- bottom: 数据输入
- top: 数据输出
- param: 所有层共享的超参数,lr_mult表示该层的学习率为基本学习率乘以这个参数
- convolution_param: 卷积参数层参数
- num_output: 必填项,为卷积核个数
- kernel_size: 必填项,为卷积核尺寸
- stride: 选填项,为步进长度,默认为1
- pad: 选填项,是否对image进行padding操作,默认为0,即不填充
- weigt_filter: 选填项,权值初始化方法
- bias_filter: 选填项,偏执项初始化方法
- bias_term: 选填项,是否使用偏执项,默认为true
(三)池化层
引入池化层,如下:
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
- name: 池化层的名字,随便写
- type: 层类型,这写上"Pooling"表示是池化层
- bottom: 数据输入
- top: 数据输出
- pooling_param: 卷积参数层参数
- pool: 必填项,为池化方式
- kernel_size: 必填项,为卷积核尺寸
- stride: 选填项,为步进长度,默认为1
(三)总 结
Caffe当中基本上定义所有操作都是通过layer字段来完成的,卷积、池化、激活函数、损失函数等等,太多了没法一一列举,其他的需要的可以参照官方的文档进行定义,链接如下:
http://caffe.berkeleyvision.org/tutorial/layers.html