【深度学习07】解决CNN的困境——胶囊网络

从2017年底到2018年初,整个人工智能学术研究领域谈论最多的应该就是被誉为深度学习之父Geoffrey E. Hinton 发表的论文 Dynamic Routing Between Capsules,其中介绍了全新的深度学习模型——胶囊网络(Capsule Network)

1. 普通CNN的困境

虽然CNN在图像识别领域取得了巨大成功并掀起了深度学习浪潮,Hinton指出CNN的工作方式与人类大脑大相径庭,继续沿着CNN的“卷积——池化”模型进行同构扩展无法达到更高的智能水平。

相对于普通神经网络,CNN的主要创新在于用卷积层自动提取各层级的特征并用这些特征进行最终预测。然而卷积层使得神经元数量大量增加,在提取特征后必须用池化层(一般为Max-pooling)进行数据降维才形成最终特征,由此带来的问题是:

  • Max-pooling 使得卷积层中的非局部最大点的信息丢失
  • Max-pooling 丢失了卷积识别出的特征在位置与角度等方面的信息。

第一条并非完全是一个缺点,它在某种程度上增加了网络的鲁棒性;但第二条会带来大问题,即它使得后续的处理无法识别特征之间的位置关系。

观察图9-48(左),其中有四个几何特征:大矩形、小矩形、两个圆形,神经网络可以通过这四个特征学习到它是一辆汽车。但如果丢失了这些特征的位置信息,则很可能将同样具有这四个特征的图9-48(右)也识别成一辆汽车。

2. 什么是胶囊

产生CNN困境的根本原因是在普通神经网络中执行运算的基本单位——神经元(neural)——处理的数据是标量(scalar),在卷积层后用抛弃神经元的方式降低数据复杂度直接丢失了很多信息。

而在新的架构中,承载运算的基本单元——胶囊(capsule)——处理的数据变成了向量(vector),用向量的线性变换降低数据复杂度使得所有信息都能够参与其中。

 这个改变推翻了沿用了几十年的基于神经元的网络计算方法,产生了全新的基于向量的胶囊运算流程。胶囊与传统神经元的运算方式对比如图9-49所示。

对该图解释如下:

  • 胶囊的输入U_1,U_2,...与输出V_1均是向量,神经元输入与输出均是标量。
  • 胶囊中的参数W_x是矩阵,用于对输入向量进行线性变换,从物理的角度理解就是做旋转、位移、缩放等处理,这部分功能是传统神经元中的缺失。 
  • 胶囊中的参数c_x是标量,作用相当于普通神经网络中的w_x,用于衡量每个输入的重要性。
  • 普通神经元用各种 \mbox{activation} 函数做非线性变换,而胶囊用所谓的 \mbox{squash} 函数对向量进行非线性变换。

在Hinton的论文中采用的 \mbox{squash} 函数形如 s(X)=\frac{\left \| X \right \|^2}{1+\left \| X \right \|^2}\cdot\frac{X}{\left \| X \right \|},该函数保持向量X方向不变,而只改变向量X的长度。在胶囊网络中,向量的方向用于定义某种特征,而向量的长度用于表示该特征存在的可能性,因此可以将 \mbox{squash} 函数理解为对预测置信度的调整与归一化。

3. 网络架构

论文在提出了胶囊的概念后设计了一个用于识别MNIST(数字手写图像库)的胶囊网络架构,如图9-50所示。

对该网络解释如下:

  • 通过卷积层对原始图像进行特征提取,形成256个 feature map
  • 与普通CNN不同的是,在卷积层后没有使用池化层进行数据降维,而是使用胶囊层 PrimaryCaps。
  • 由于卷积层有256个 feature map,因此胶囊层的每个输入向量是256维,即图9-49中的 U_1,U_2 等都是256维向量。
  • 与卷积层每个神经元从原始图像中的某个局部区域扫描特征类似,每个胶囊也从上一层的某局部区域的向量获得输入,论文中每个 PrimaryCaps 中的胶囊有9\times9=81个输入向量,即图9-49中的输入向量个数n等于81。
  • PrimaryCaps 中共有 6\times6\times32=1152 个胶囊,每个胶囊输出 8 维向量。

因此,卷积层中的标量数值共有 20\times20\times256=102400 个,而 PrimaryCaps 中的标量数值共有 1152\times 8=9216 个,达到了相当于池化层的降维目的,并且不会丢失卷积层中特征的位置信息。

在 PrimaryCaps 之后可以连接任意胶囊层继续搭建网络,其意义与在CNN中用多个卷积层逐层提炼更高级别知识的作用类似。

此外,论文中还提到了胶囊网络参数新的训练方法——动态路由算法(Dynamic Routing Algorithm),它用于替代传统网络中的反向传播对图9-45中的W_x参数进行训练,有兴趣的读者可以研读原论文。

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 深度学习是当今计算机科学领域最为热门的研究方向之一,其在图像分类、语言识别、自然语言处理等诸多领域都有广泛的应用。而卷积神经网络(CNN)是深度学习中最为核心的模型之一,它能够有效地提取图像的特征并进行分类。本文将介绍如何使用matlab搭建卷积神经网络。 首先,我们需要准备好所需的数据集,这是构建卷积神经网络的必要条件。可以在网上找到一些现成的数据集,如MNIST手写数字数据集,CIFAR-10图像分类数据集等等。 接下来,我们需要创建一个卷积神经网络。在matlab中,可以使用Deep Learning Toolbox来创建卷积神经网络模型。我们需要指定网络的层数、每层的神经元个数、激活函数等参数,以及网络的损失函数、优化算法等参数。 然后,我们需要将数据集分成训练集和测试集,并将其加载到matlab的工作空间中。可以使用matlab自带的数据集加载函数或者自己编写数据集加载函数来完成这一步骤。 接下来,我们需要对数据进行预处理,以便将其交给卷积神经网络进行训练。预处理包括图像的标准化、图像增强、数据扩充等操作。 最后,我们需要使用trainNetwork函数来训练我们的卷积神经网络,并使用testNetwork函数来测试网络的性能。网络训练完毕后,可以保存模型以备将来使用。 总的来说,用matlab进行卷积神经网络的搭建十分方便,并且matlab还提供了许多实用的工具箱和函数来辅助网络的训练和测试。若想深入研究深度学习,matlab是一个不错的选择。 ### 回答2: 深度学习是现代计算机科学的热门领域,它通过神经网络的层次结构来学习复杂的模式,特别是在图像、语音和自然语言处理上表现突出。Matlab是一种广泛用于数学建模、数据分析和科学计算的软件工具,也被用于深度学习领域。本文将介绍如何使用Matlab从零开始搭建卷积神经网络CNN。 首先,我们需要导入一些深度学习常用的库。例如 MatConvNet 和 VLFeat,这两个库都是由Matlab编写的,方便用户在Matlab中实现卷积神经网络。接下来,我们需要构建神经网络的模型,包括卷积层、池化层、全连接层等。这里,我们将使用卷积层、池化层交替的组合来搭建CNN模型,并设置相关的参数,例如数目、步长和大小等。 然后,我们需要准备好训练数据和测试数据,这些数据可以是图像、语音或文本等。我们需要将数据集进行预处理,例如归一化、预处理等,以确保数据数据量相等和格式标准化。接下来,我们需要定义模型的训练方法,例如使用反向传播算法以最小化误差和损失函数,而优化器可以选择常用的SGD、Adam或Adagrad等。 最后,我们需要对我们训练好的模型进行测试,测试过程中会给出一些输入样例,然后模型会输出对应的预测结果,我们可以根据这些结果来评估模型的性能和准确度。如果模型的性能不好,我们可以使用更多的层数、更多的节点或更多的数据来改善模型。 总之,使用Matlab搭建卷积神经网络的过程比较复杂,需要对深度学习的知识有一定的了解,并具备一定的程序能力。通过本文的介绍,相信读者能够初步了解到如何搭建卷积神经网络,并在实践中逐渐提高自己的能力。 ### 回答3: 在进行深度学习研究时,卷积神经网络(CNN)是一种非常常见的网络结构。使用Matlab可以高效地实现并训练CNN。下面将以一个简单的手写数字识别任务为例,从0开始介绍如何在Matlab中搭建和训练卷积神经网络。 首先需要导入手写数字数据集。在Matlab中已经内置了一个手写数字数据集,可以使用以下命令导入: ``` digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos','nndatasets','DigitDataset'); imds = imageDatastore(digitDatasetPath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames'); ``` 接下来,需要设置网络结构和超参数。这里选择一个包含两个卷积层和两个全连接层的CNN,同时设置学习率、迭代轮数等超参数。 ``` layers = [ imageInputLayer([28 28 1]) convolution2dLayer(3,16,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,32,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(256) batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer]; options = trainingOptions('adam', ... 'MaxEpochs',20,... 'MiniBatchSize',128, ... 'InitialLearnRate',0.001, ... 'Shuffle','every-epoch', ... 'Verbose',false, ... 'Plots','training-progress'); ``` 然后可以开始训练模型。使用以下命令可以开始训练: ``` net = trainNetwork(imds,layers,options); ``` 最后,可以使用测试集对训练好的模型进行评估,并计算出模型的准确率: ``` YPred = classify(net,augimdsTest); YTest = imdsTest.Labels; accuracy = sum(YPred == YTest)/numel(YTest); ``` 通过这个例子,可以看出使用Matlab搭建和训练卷积神经网络是非常简单的。同时,Matlab提供了许多预训练模型和工具箱,可以方便地进行深度学习研究和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值