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

 新闻资讯     |      2020-01-09 17:49

本文为 AI 研习社编译的技术博客,原标题 :Capsule Networks: A new and attractive AI architecture作者 | Ayyüce Kzrak翻译 | 安石徒、Disillusion、AdaAlvin、friedhelm739校对 | 酱番梨 整理 | 菠萝妹原文链接:https://heartbeat.fritz.ai/capsule-networks-a-new-and-attractive-ai-architecture-bd1198cc8ad4

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

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

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

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

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

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

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

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

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

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

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

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

按摩坐垫

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

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

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

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

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

defCapsNet(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)函数定义。由于这个计算步骤,在图像中不存在对象的区域中向量值很小,而检测区域中向量的维度根据属性而变化。

classCapsuleLayer(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) defbuild(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模型相比。

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

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

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

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

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

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

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

[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 Beer, Merve Ayyüce KIZRAK, Bülent BOLAT, Tülay YILDIRIM, https://github.com/ayyucekizrak/Kapsul-Aglari-ile-Isaret-Dili-Tanima