365bet体育|www.635288com-365体育手机在线

热门关键词: 365bet体育,www.635288com,365体育手机在线

在神经元之间计算卷积需要大量的计算

2020-01-24 作者:365bet体育   |   浏览(142)

图片 1

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

Capsule Networks: A new and attractive AI architecture

作者 | Ayyüce Kızrak

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

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

原文链接:

注:本文的相关链接请点击文末进行访问

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

图片 2罂粟花胶囊

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

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

图片 3基本的卷积神经网络

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

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

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

图片 4*Geoffrey Hinton 和 Sara Sabour*

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

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

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

由此引出:胶囊网络

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

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

图片 5毕加索和他的女神们

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

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

图片 6挤压函数

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

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

图片 7协议路由算法

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

图片 8胶囊网络的角度估计

下一步至关重要:

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

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

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

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

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

图片 9初级胶囊的卷积过程

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

图片 10胶囊层

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  conv1 = layers.Conv2D(filters=256, kernel_size=9, strides=1, padding='valid', activation='relu', name='conv1') # 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__ 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')

你也可在此查看全部代码。

性能测试

本文由365bet体育发布于365bet体育,转载请注明出处:在神经元之间计算卷积需要大量的计算

关键词: 胶囊 架构 吸引力

365bet体育推荐