2017-3-6 写过cnn本质是卷积和pooling,而不是因为深。一直想着办法验证这个理论。到目前为止,昨天终于有了惊喜的结果。
深度学习之cnn于图像识别,从不同的分辨率进行卷积和pooling,自然形成了很深度的深度了。卷积是形成不同的图像块的聚类核心,pooling是在一定范围内,寻找其中响应最大的模式,也就是对抗了图像偏移问题。
cnn的卷积实际是聚类到不同的聚类核心。所以这里采用的不再是真正的卷积,而是采用聚类核心。以下文中出现的卷积都是指聚类核心,类似kmean的聚类核心。
目前思路是采用类似kmeans 聚类,形成多个聚类核心。目前只是对图形进行2x2的块pooling一次进行验证。比如32x32图形,采样为31x31,步长为1,这样形成2x2的聚类输出,max pooling 之后输出一个31x31图像。在mnist上验证,同样的输出特征,输入到svm进行分类,对比未卷积pooling之前,获得零点几到1个百分比提升。而对卷积pooling之后的特征使用automean (一种改进的聚类核分类器,类似knn和kmean的结合体)分类,得到的分类精度与svm一样。在不使用卷积和pooling的原始mnist数据集上, knn automeans 分类精度都会低于svm1个百分点。 这也证明卷积pooling之后使得数据的更容易被分类。
automean 可以理解为 kmean, 其预测数值av 是 数据与聚类核心的距离的倒数。kmean需要事先设定聚类核心的个数,这个不便于实际使用;同时kmean不会把同类数据尽量聚集到相同的核心。automean就是简单对这两个问题的修正。能把同类数据尽量聚类到同一个核心,同时聚类核心个数动态分配。 automean使用带标签的有监督训练。
训练阶段:输入图像32x32 ,使用 31x31采样,步长为1, 形成 2x2个31x31的数据块(标记为输入map:inmap)。首先对每个卷积块预测,对应形成 2x2的map 预测输出每一个位置都是一个31x31的数据,和一样输出响应值 AV。31x31的数据是automeans输出,为最近距离的聚类核心的数值;av数值是automean的输出。对outmap进行max pooling,找到最大响应的位置, 并使用对应位置的inmap的卷积块数据更新训练 automean。
预测编码阶段: 与训练阶段类似,但是对automean更新训练。输入图像32x32 ,使用 31x31采样,步长为1, 形成 2x2个31x31的卷积块(标记为输入map:inmap)。首先对每个卷积块预测,对应形成 2x2的map 预测输出每一个位置都是一个31x31的数据,和一样输出响应值 AV,该av数值是automean的输出。对outmap进行max pooling,找到最大响应的位置。 将该位置的输出的31x31数值作为本卷积pooling层的输出特征即可。
进一步打算构建多层次逐步卷积pooling,以便验证能达到更好的效果,或者和通常cnn一样的效果。如果2层以上能配合工作,能达到更好的效果,那就perfect。
这么的方式不是为了和深度学习制造不同,而是为了理解其本质,构造更简单更好用分类器。
1、可以使用自顶向下的金字塔方式训练分类器,而不是所有图片从最小的块开始训练。学习时间会非常快速。
2、金字塔方式,多分辨率,可以形成无数目标的局部特征,通过局部特征进行目标推测, 这使得图像识别过程,不再是整个图像不同分辨率进行滑动窗口暴力识别。
3、可以做到动态增量的分类器。
4、训练不再是神经网络的方式,而是简单聚类, 不需要神经网络的反复反馈更新过程。不会有过拟合,神经单元数量选择等问题。
此思路为原创,2017-5-16.