可视化探索卷积神经网络提取特征

卷积神经网络的发展主要是为了解决人类视觉问题,不过现在其它方向也都会使用。发展历程主要从Lenet5->Alexnet->VGG->GooLenet->ResNet等。

 

传统神经网络

 

传统BP神经网络层与层之间都是全连接的,对于图像处理领域,当神经网络处理大图像时,全连接会导致待训练的参数非常庞大,比如100万个像素的图像,对于100个节点的隐层,则会产生亿级别的参数,如果更多层及更多个节点那参数数量将会无比庞大。此外,传统BP神经网络没有假设相邻图像之间存在紧密联系。综上所述,BP神经网络不适合做图像处理。

 

卷积神经网络

 

为减少参数数量,首先想到可以构建部分连接的神经网络,每个神经元不再与上层所有神经元相连,而是连接某部分。另外还能通过权值共享来减少参数数量,一组连接共享权重而不必每个连接权重都不同。除此之外,还能通过池化来减少每层的样本数,从而减少参数数量。结合以上特点,卷积神经网络就是这样的一种网络。

 

看一个卷积神经网络示意图,它包含了若干卷积层、池化层和全连接层。图像输入经过第一层卷积层处理后,得到4层feature,为什幺可以是4层呢?其实就是可以自定义4个不同的filter对输入分别运算,就得到4层feature。然后池化层对卷积后的feature进行池化处理,得到更小的feature,这里运算后同样是4层feature。接着继续根据filter做卷积和池化处理,最后通过两个全连接层完成输出。

可视化探索卷积网络

 

其实有时候我们很好奇图片经过卷积神经网络的每个层后变成什幺样子,想了解下这个过程发生了什幺变化,此时我们就可以使用一个工具——Quiver。它开源再github上, github.com/keplr-io/qu… 。通过它可以很方便对卷及网络进行探索,以web浏览器形式实现对模型的可视化,可以看到不同网络层的变化。

 

为方便起见,这里直接创建VGG16模型实例。通过下面脚本将下载VGG16模型的权重参数(这里自动下载的是经过Imagenet训练的模型参数,包含了1000个类别),权重参数总大小达到百兆字节,然后模型被加载到内存中并创建一个监听5000端口的服务。

 

import keras.applications as apps
from quiver_engine.server import launch
model = apps.vgg16.VGG16()
launch(model, input_folder="data")

 

访问浏览器,选择其中一个图片作为输入,左侧为网络架构图形,并且点击不同层可以看到不同的输入。右侧的图片我们可以点击选择,然后应用程序会自动将其作为输入,模型再根据该输入预测出可能性最高的五个结果。其中可以看到224×224的输入,而且是3层,分别代表原始图像的红、绿、蓝。

然后选择第一个卷积层,可以看到通过卷积核的操作后不同的特征被突出,突出的特征包括不同类型的边缘、亮度和对比度等等。

继续往下可以看到特征越来越抽象,包含了不同的纹理、角度等等,还可能是眼睛和鼻子。

继续往下到最后的卷积层时,此时的特征已经抽象到我们人类已经无法理解了,对于我们来说,看到的特征并没有任何意义。最终通过完全连接层并得到包含了1000个元素的概率数组,即对应ImageNet中每个类别的概率。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注