Quantcast
Viewing latest article 9
Browse Latest Browse All 35570

思考: 神经网络层 的 功能识别

基本知识

卷积操作 即为 一系列 滤波操作 之和 。 有关卷积的概念,具体可参加我的这篇文章:深度学习: convolution (卷积)

观察

初始化后的深度学习模型的训练就像一个婴孩。
在训练过程中,各网络层 总数不变,但在梯度下降的 引导 下,不断 分化 成各种 功能层 。各功能层 协作 ,使得模型成熟而强大。

而每个神经网络层的 卷积核,其实就是 一系列的 filter(滤波器)集合

Zeiler 和 Fergus 两位大佬在他们获得ECCV2014最佳论文提名奖的论文《Visualizing and Understanding Convolutional Networks》中,就对各卷积层的 feature map(特征图) 展开了 可视化探究

Image may be NSFW.
Clik here to view.
这里写图片描述

但是他们却没有对 生成 各卷积层feature map 的 filter(滤波器) 展开 功能规律探究

Idea

训练好的模型中,各神经网络层weight参数初看起来像是一组乱序的tensor,但是既然他们能 分化 成各种 功能层 ,意味着他们一定会长得越来越像 该功能 所对应的 filter集合 。我之前在github上开源了一个关于图像滤波器的项目:Image_Filter 。可以看出,实现某种卷积操作(其实等同于某种滤波操作)以实现该特征抽取功能,那么所用到的卷积核(即为滤波器集合)一定会 近似于 某种滤波器集合。

Image may be NSFW.
Clik here to view.
这里写图片描述

例如,如果该功能层80%的功能是实现边缘提取,那么它的卷积核一定长得像加长版的边缘滤波器。

而各种边缘滤波器,长得又都类似:
(代码截取自Image_Filter

def Edge_Detection_360_degree_Filter():
    # Edge_Detection_360° Filter  360°边缘检测 滤波 (抽取 边缘特征)
    filter_0 = np.array([[[-1,0,0],[-1,0,0],[-1,0,0]],
                         [[-1,0,0],[8,0,0],[-1,0,0]],
                         [[-1,0,0],[-1,0,0],[-1,0,0]]],
                        dtype=np.int16)
    filter_1 = np.array([[[0,-1,0],[0,-1,0],[0,-1,0]],
                         [[0,-1,0],[0,8,0],[0,-1,0]],
                         [[0,-1,0],[0,-1,0],[0,-1,0]]],
                        dtype=np.int16)
    filter_2 = np.array([[[0,0,-1],[0,0,-1],[0,0,-1]],
                         [[0,0,-1],[0,0,8],[0,0,-1]],
                         [[0,0,-1],[0,0,-1],[0,0,-1]]],
                        dtype=np.int16)
    return filter_0, filter_1, filter_2

def Edge_Detection_45_degree_Filter():
    # Edge_Detection_45° Filter  45°边缘检测 滤波 (抽取 边缘特征)
    filter_0 = np.array([[[-1,0,0],[0,0,0],[0,0,0]],
                         [[0,0,0],[2,0,0],[0,0,0]],
                         [[0,0,0],[0,0,0],[-1,0,0]]],
                        dtype=np.int16)
    filter_1 = np.array([[[0,-1,0],[0,0,0],[0,0,0]],
                         [[0,0,0],[0,2,0],[0,0,0]],
                         [[0,0,0],[0,0,0],[0,-1,0]]],
                        dtype=np.int16)
    filter_2 = np.array([[[0,0,-1],[0,0,0],[0,0,0]],
                         [[0,0,0],[0,0,2],[0,0,0]],
                         [[0,0,0],[0,0,0],[0,0,-1]]],
                        dtype=np.int16)
    return filter_0, filter_1, filter_2

那么意味着:

相同功能 的网络层,卷积核 一定 长得彼此类似

通过总结出各类功能层的 “大众脸”(即大众型卷积核的参数分布),即可找出规律。

Idea用途

可用于对 训练好的 神经网络层 进行 功能识别

网络层 功能识别 具体步骤

总结出常用的几类功能滤波器(例如颜色特征抽取、边缘特征抽取、纹理特征抽取、肢干特征抽取、整体特征抽取)。

对要进行识别的网络层,输入该层训练好的卷积核。对 维度 进行 归一化 ,以保证要识别的 tensor 有一致的size。

将预处理过的待识别卷积核与常用的几类功能滤波器进行相似度比较。(比如通过l2范数,求得各位置上对应参数值的距离差异)

通过比较结果得出该卷积核的分类情况,如下图:

颜色特征提取 边缘特征提取 纹理特征提取 肢干特征提取 整体特征提取
2% 10% 80% 8% 2%


从而通过最大概率, 判定 该功能层为 纹理特征提取层

当然,也可通过 大于10%概率阈值 的筛选方法,判定其为 (80%纹理+10%边缘)特征提取层

作者:JNingWei 发表于2018/1/4 21:53:09 原文链接
阅读:125 评论:0 查看评论

Viewing latest article 9
Browse Latest Browse All 35570

Trending Articles