本文主要是对传统的卷积网络进行改进,关键点有两个:
第一:mlpconv
第二:全局平均池化
传统的cnn可以看做是广义线性模型GLM,所以cnn觉得潜在的概念都是线性可分的。(但是cnn+非线性激活不是能模拟出非线性吗?)但是一些数据是非线性、多维度的,因此提出将卷积替换为更多小部分的非线性函数,从而提升模型的抽象能力。
作者通过mlpconv模拟多部分非线性函数。具体结构如下图:
下面的结构是一个mplconv:
layers {
bottom: "data"
top: "conv1"
name: "conv1"
type: CONVOLUTION
blobs_lr: 1
blobs_lr: 2
weight_decay: 1
weight_decay: 0
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
mean: 0
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layers {
bottom: "conv1"
top: "conv1"
name: "relu0"
type: RELU
}
layers {
bottom: "conv1"
top: "cccp1"
name: "cccp1"
type: CONVOLUTION
blobs_lr: 1
blobs_lr: 2
weight_decay: 1
weight_decay: 0
convolution_param {
num_output: 96
kernel_size: 1
stride: 1
weight_filler {
type: "gaussian"
mean: 0
std: 0.05
}
bias_filler {
type: "constant"
value: 0
}
}
}
layers {
bottom: "cccp1"
top: "cccp1"
name: "relu1"
type: RELU
}
layers {
bottom: "cccp1"
top: "cccp2"
name: "cccp2"
type: CONVOLUTION
blobs_lr: 1
blobs_lr: 2
weight_decay: 1
weight_decay: 0
convolution_param {
num_output: 96
kernel_size: 1
stride: 1
weight_filler {
type: "gaussian"
mean: 0
std: 0.05
}
bias_filler {
type: "constant"
value: 0
}
}
}
layers {
bottom: "cccp2"
top: "cccp2"
name: "relu2"
type: RELU
}
全局平均池化用于替代传统的fc层,由于在传统的卷积网络中,卷积层提取特征,全连接层用于将卷积转为分类,而这过程相当一黑盒部分,还有过拟合风险。因此本文提出了全局平均池化,举个例子,通过之前的各种卷积或者mlpconv生成了1000x6x6的feature map,其中1000为特征层的维数,6x6为feature map的大小。如果将一个feature map看做一种类别对应的特征图,则直接将feature map池化为一个点,再加上softmax就可以分类。(这种思想相比于fc比较形象,但是中间也有很多难以解释的事情,╮(╯▽╰)╭)
层结构如下:
layers {
bottom: "cccp8"
top: "pool4"
name: "pool4"
type: POOLING
pooling_param {
pool: AVE
kernel_size: 6
stride: 1
}
}