深度学习·神经网络·计算机视觉

胶囊网络:一种全新的富有吸引力的AI架构

2019-01-17  本文已影响15人  AI研习社

本文为 AI 研习社编译的技术博客,原标题 :

Capsule Networks: A new and attractive AI architecture

作者 | Ayyüce Kızrak

翻译 | 安石徒、Disillusion、AdaAlvin、friedhelm739

校对 | 酱番梨 整理 | 菠萝妹

原文链接:

https://heartbeat.fritz.ai/capsule-networks-a-new-and-attractive-ai-architecture-bd1198cc8ad4

注:本文的相关链接请点击文末【阅读原文】进行访问

胶囊网络:一种全新的富有吸引力的AI架构

罂粟花胶囊

本文已被翻译为英文并首次发表在《Deep Learning Turkey》。

卷积神经网络(CNN)因其在目标识别和分类任务中的成功应用而被计算机视觉应用界所青睐。CNN是由堆叠在一起的多个神经元组成的。在神经元之间计算卷积需要大量的计算,因此通常使用池化来减小网络层的大小。卷积方法可以通过简单的计算来学习数据的许多复杂特征。通过对输入进行矩阵乘法和求和,我们可以得出问题的答案。

基本的卷积神经网络

我总是听到CNN到底有多优秀。但是他们什么时候会失败呢?

CNN在解决物体识别和分类问题方面确实取得了巨大的成功。然而,它们并不完美。如果输入CNN的对象处于一个CNN不熟悉的方向,或是出现在CNN从未见过的地方,那么它的预测任务很可能失败。

例如,如果你把一张脸颠倒过来,网络将不再能够识别眼睛、鼻子、嘴巴以及它们之间的空间关系。类似地,如果改变面部的特定区域(即切换眼睛和鼻子的位置),网络也可以识别脸部,但是它已经不是真正的脸部了。CNN只学习到了图像中的统计信息,但是他们没有学习基本的思维,即到究竟什么样子才会被称作是脸。

*Geoffrey Hinton 和 Sara Sabour*

关于CNN为何不能学习思维的理论,人工智能之父杰弗里·辛顿(Geoffrey Hinton)针对于用于缩小网络规模和计算需求的池化操作哀叹道:

“在卷积神经网络中使用的池化操作是一个大错误,它工作得如此好就是一个灾难!”

池化层破坏信息,使得网络无法学习更高级的思维。因此,他着手开发一种新的体系结构,这种体系结构并不很依赖于这种池化操作。

由此引出:胶囊网络

什么是胶囊网络?

Hinton 和 Sabour 从神经科学中借用了一些想法,即认为大脑被组织成了叫做胶囊 的模块。这些胶囊特别擅长处理物体的姿态(位置、大小、方向)、变形、速度、反照率、色调、纹理等特征。

他们推测,大脑肯定有一种机制,将低层次的视觉信息传递到它认为能最好的处理这些信息的胶囊。针对卷积神经网络模型性能不足的领域问题,人们提出了胶囊网络和动态路由算法。

毕加索和他的女神们

胶囊表示图像中特定实体的各种特征。一种非常特殊的特征是图像中实例化实体的存在。实例化实体是诸如位置、大小、方向、变形、速度、反照率、色调、纹理等参数。表示其存在的一个简单方法是使用单独的逻辑单元,其输出是实体存在的概率[1]。为了得到比CNN更好的结果,我们应该使用一个迭代的协议路由机制。这些特性称为实例化参数。在经典的CNN模型中是没有得到图像中目标的这些属性的。平均/最大池层减少了一组信息的大小,同时减少了其尺寸大小。

图中有些地方有嘴唇、鼻子和眼睛,但是卷积神经网络不知道它们在哪和应该在哪里。对于传统网络,这些错放的特性不会影响到它!

**挤压函数 **

挤压函数

在深度神经网络中,激活函数是应用于层输出的简单数学运算。它们用于近似数据中存在的非线性关系。激活层通常对标量值起作用,例如,对向量中的每个元素进行规范化,使其介于0和1之间。

在胶囊网络中,一种称为挤压函数的特殊类型的激活函数被用来归一化矢量的大小,而不是标量元素本身。

协议路由算法

这些挤压函数的输出告诉我们如何通过训练成学习不同思维的各种胶囊来路由数据。图像中每个对象的属性都用路由它们的向量来表示。例如,面部的激活可以将图像的不同部分路由到能够理解眼睛、鼻子、嘴和耳朵的胶囊。

针对MNIST数据集的胶囊网络应用

胶囊网络的角度估计

下一步至关重要:

就像深层CNN的不同层数学习图像的不同语义属性(内容、纹理、样式等)一样,胶囊也可以被组织成不同的层次。同一层的胶囊进行预测,学习对象的形状,并将其传递给学习方向的更高层次的胶囊。当多个预测一致时,更高级别的胶囊变得活跃。这个过程被描述为动态路由,现在我将更详细地讨论它。

那么我们先创建一个用于对MNIST数据集进行分类的分步胶囊体系结构:

第一层为典型的卷积层。在第二层中,在称为初级胶囊 的层中执行卷积过程,其中应用了挤压函数。每个主胶囊接收图像的一个小区域作为输入(称为感受野),它用来检测特定图案(如圆圈)的存在和姿态。

较高层的胶囊(称为路由胶囊)检测更大和更复杂的物体,如由两个圆组成都的数字8。然后他们使用一个新的挤压函数来保证这些向量的长度在0-1之间。

在初级胶囊层之前应用标准卷积层,并且得到9x9x256的输出。在初级胶囊层中采用32通道、步长为2的卷积核。然而,这个区别于其他卷积核的特征就是挤压函数。最后就得到了初级胶囊的输出。

初级胶囊的卷积过程

此时可以得到6x6的输出。因为在应用了动态路由算法的胶囊层中,其具有第三层动态路由的结果(根据协议路由算法),即获得这些8-长度输出DigitCaps矢量的32个输出。协议路由算法包括一些协议(检测和路由)更新的迭代。

胶囊层
def CapsNet(input_shape, n_class, num_routing):    
   """    
   MNIST Dataset for Capsule Networks.    
      : "input_shape" parameter: vdata shape, 3d, [w,h,c]    
      : "n_class" parameter: number of classes    
      : "num_routing" parameter: dynamic routing number of iteration    
      : Function output: two Keras model, first for training, second for evalaution.    
           `eval_model` used for traning at the same time.    
   """    
   x = layers.Input(shape=input_shape )  
 
   # LAYER 1: Convolution Layer (Conv2D)    
   conv1 = layers.Conv2D(filters=256, kernel_size=9, strides=1, padding='valid', activation='relu', name='conv1')(x) 
  
   # LAYER 2: Conv2D squash activation, [None, num_capsule, dim_capsule] fro reshaping.    
   primarycaps = PrimaryCap(conv1, dim_capsule=8, n_channels=32, kernel_size=9, strides=2, padding='valid')  
 
   # LAYER 3: Capsule Layers. Run: Dynamic routing algorithm.    
   digitcaps = CapsuleLayer(num_capsule=n_class, dim_capsule=16, num_routing=num_routing,    
                            name='digitcaps')(primarycaps) 
  
   # LAYER 4:    
   # If you use Tensorflow you can skip this session :)  
 
   out_caps = Length(name='capsnet')(digitcaps)

capsulelayers.py中的动态路由类CapsuleLayer (layers.Layer)函数定义。由于这个计算步骤,在图像中不存在对象的区域中向量值很小,而检测区域中向量的维度根据属性而变化。

class CapsuleLayer(layers.Layer):    
   """    
   The capsule layer. It is similar to Dense layer. Dense layer has `in_num` inputs, each is a scalar, the output of the     
   neuron from the former layer, and it has `out_num` output neurons. CapsuleLayer just expand the output of the neuron    
   from scalar to vector. So its input shape = [None, input_num_capsule, input_dim_capsule] and output shape = \    
   [None, num_capsule, dim_capsule]. For Dense Layer, input_dim_capsule = dim_capsule = 1. 
      
   :param num_capsule: number of capsules in this layer    
   :param dim_capsule: dimension of the output vectors of the capsules in this layer    
   :param routings: number of iterations for the routing algorithm    
   """    
   def __init__(self, num_capsule, dim_capsule, routings=3,    
                kernel_initializer='glorot_uniform',    
                **kwargs):    
       super(CapsuleLayer, self).__init__(**kwargs)    
       self.num_capsule = num_capsule    
       self.dim_capsule = dim_capsule    
       self.routings = routings    
       self.kernel_initializer = initializers.get(kernel_initializer)    

   def build(self, input_shape):    
       assert len(input_shape) >= 3, "The input Tensor should have shape=[None, input_num_capsule, input_dim_capsule]"    
       self.input_num_capsule = input_shape[1]    
       self.input_dim_capsule = input_shape[2]    

       # Transform matrix    
       self.W = self.add_weight(shape=[self.num_capsule, self.input_num_capsule,    
                                       self.dim_capsule, self.input_dim_capsule],    
                                initializer=self.kernel_initializer,    
                                name='W')

你也可在此查看全部代码

性能测试 🏅

在对10000幅图像的测试数据集进行测试时,我们对MNIST数据集的准确率达到99.61%,对FASHION MNIST数据集的准确率达到92.22%。棒吧!!😎

对于80%重叠手写数字的MultiMNIST数据集,当数据重叠时胶囊网络的性能显得非常好,特别是与CNN模型相比。

*MultiMNIST 数据集的胶囊网络输出*

MNIST的50次迭代用时 ⏳

与CNN相比,由于计算的复杂性,胶囊网络的训练时间较慢。以下是在各种硬件和云服务器上的50迭代训练时间:

肯定 :)

要使用谷歌Colab支持,最吸引人的选项,请阅读谷歌Colab的免费GPU教程!

胶囊网络的✔️优点和❌缺点

✔️相比其他先进的技术,对MNIST数据集用胶囊网络有着最高的成功率。

✔️使用较小的数据集将更加成功。(通过迫使模型在胶囊中学习特征变量,它可以更有效地用更少的训练数据推断出可能的变量。)

✔️routing-by-agreement算法使我们能够区分有重叠图像的对象。

✔️更容易用激活向量理解图像。

✔️胶囊网络能够保留诸如同变性、色调、姿势、反照率、质地、变形、速度和对象位置等信息。

❌和一些出色的模型相比,CIFAR10 在数据集的表现上并不成功

❌没有在大规模的数据集上测试

❌由于采用协议路由算法,训练模型需要更多的时间。

不同路由算法的胶囊网络模型的应用表明,它是一个需要更多实验和正在发展的课题。

如上面的图例所示,当仅仅改变Kim Kardashian的图片方向,预测的准确度就会大幅下降。右边的图片,我们能很容易地看出来一只眼睛和她的嘴巴都放在错误的位置,这不是一个人该有的模样。然而,我们却看到这张图是被预测为是人的可能性是0.9。

一个被训练地很好的CNN模型在这个方法上会有一些问题。除了很容易地被特征被放置在错误位置的图片欺骗,对于不同方向的图片,CNN模型也很容易辨认不明。

毫无疑问,CNN会受到对抗性攻击的影响。这是一个会引起安全问题的重要约束,尤其当我们将一个隐形样式嵌入到对象中使其看起来像其它东西时。但是,正如我们已知,我们可以通过胶囊网络来解决这个问题!

我们在胶囊网络中的学术论文

基于胶囊网络的手势识别(Recognition of Sign Language Using Capsule Networks)

视力和听力受损的人们可以在唇语或手和面部表情(如符号语言)的帮助下仍能交流。胶囊网络能帮助确保残疾人能不仅无障碍地生活而且可以通过健康有效的跟其他人沟通来提高生活质量。

在这项工作中,胶囊网络的手势数字识别正确率能达到94.2%:

手势数据集(Sign Language Digits Dataset, Arda Mavi ve Zeynep Dikle)

参考文献:

[1] Sabour, S., Frosst, N. ve Hinton, G.E., “Dynamic Routing Between Capsules’’, arXiv preprint arXiv:1710.09829, 2017.

[2]Hinton, G. E., Krizhevsky A. ve Wang, S. D. “Transforming Auto-encoders.” International Conference on Artificial Neural Networks. Springer, Berlin, Heidelberg, 2011.

[3] CSC2535: 2013 Advanced Machine Learning Taking Inverse Graphics Seriously, Geoffrey Hinton Department of Computer Science University of Toronto, 2013.

[4] Capsule Network Implementation of MNIST dataset (in Turkish explanation, Deep Learning Türkiye, kapsul-agi-capsule-network.

[5] Recognition of Sign Language Using Capsule Networks, Fuat Beşer, Merve Ayyüce KIZRAK, Bülent BOLAT, Tülay YILDIRIM, https://github.com/ayyucekizrak/Kapsul-Aglari-ile-Isaret-Dili-Tanima

想要继续查看该篇文章相关链接和参考文献?

长按链接点击打开或点击胶囊网络:一种全新的富有吸引力的AI架构

https://ai.yanxishe.com/page/TextTranslation/1364

AI研习社每日更新精彩内容,观看更多精彩内容:

7分钟了解Tensorflow.js

在Keras中理解和编程ResNet

初学者怎样使用Keras进行迁移学习

如果你想学数据科学,这 7 类资源千万不能错过

等你来译:

深度学习目标检测算法综述

一文教你如何用PyTorch构建 Faster RCNN

高级DQNs:利用深度强化学习玩吃豆人游戏

用于深度强化学习的结构化控制网络 (ICML 论文讲解)

上一篇下一篇

猜你喜欢

热点阅读