Dynamic Routing Between Capsules(胶囊网络与源码解析)

109 篇文章 159 订阅
订阅专栏

在这里插入图片描述
"我要指出 CNN 的问题,告诉你们为什么 CNN 是垃圾。"

伟大先驱Hinton发表在NIPS2017的首次正式提出Capsules,但其实Hinton早在2011年就有类似的想法了,原因是他认为CNN不够好,有很多的缺点,其中最突出的就是:CNN 不使用坐标系,当我们人类观察东西的时候,只要看到一个形状,我们就会给它假定一个坐标系。但CNN不具备这种旋转组合的能力。

  • 不变性 (invariance) 。指不随一些变换来识别一个物体,具体变换包括平移 (translation),旋转 (rotation),视角 (viewpoint),放缩 (scale) 等。不变性通常在物体识别上是好事,因为不管一个房子怎么平移、2D旋转、3D旋转和放缩,我们都可以识别出它是房子。但如果我们的任务比物体识别稍微困难一点,比如我想知道它平移了多少个单位,旋转了多少度,放缩了百分之多少,那么不变性远远不够,这时需要的是同变性。
  • 同变性(equivariance) 。不变性是表示不随变换 (transformation) 变化,而同变性就是表示的变换等价于变换的表示。

著名的就是将人脸的眼睛和鼻子互换之后这种很不合理的图仍然被识别成person咯,由于不变性,对于模型来说图片中某些部分不管怎么变动是一样的,即便它是不合理的。所以我们想要的不仅仅是有眼睛,鼻子,嘴巴这些组件就能够成为person了,而且需要这三者能够有一定的空间相互关系才行,这是因为CNN在pooling的时候,会丢失掉一些特征间的关系(如max pooling,不管感受野里面哪一块数据最大,结果都是一样的),虽然对于识别整张图像做分类之类没有很大的影响,但在需要更精确得到位置的场景下就无能为力了,所以在这种情况下pooling是没有用的(只能给出这个卷积核区域中的最大值,但是并不知道是从什么方向来的)。

所以能否把这个普通的值,变成方向呢??即向量不仅仅只是向量了,应该变成能够表示这种空间关系的张量!带着方向感,所以某种程度上,胶囊网络叫做向量神经元 (vector neuron) 甚至张量神经元 (tensor neuron) 更贴切。为了解决这个问题,Hinton提出使用一个叫做“routing-by-agreement”的过程。这意味着,较为底层的特征(手、眼睛、嘴巴等)将只被传送到与之匹配的高层。如果,底层特征包含的是类似于眼睛或者嘴巴的特征,它将传递到“面部”的高层,如果底层特征包含的是类似手指、手掌等特征,它将传递到“手”的高层。

「胶囊」的出发点是,在神经网络中建立更多的结构,然后希望这些新增的结构可以帮助模型更好的泛化。即capsule想要学习到的就是object part组件之间的方向性,以更好的保留对象的姿态信息。如上图里面的v1,v2两个组件通过一些空间关系最后组成一个entity,其中的v1组件的空间位置仍然是用向量,如v1的向左和向右对于向量的变化虽然是某一维的对立如是-1,1,但我们想要的结果是 :

  • 向量不同,但表达的事物是一致的,不影响分类
  • 通过控制这一维,可以得到特定旋转的组件
  • 并通过多个这样的组件,组合成为最后的结果

如何做到?Dynamic Routing Between Capsules。

Dynamic Routing Between Capsules
在这里插入图片描述
所谓的一个胶囊Capsule其实就是一种试图在给定位置上预测是否有特定对象存在,以及其实例化参数的方法。激活向量的方向是由这些对象的实例化参数编码而成,然后用每个激活向量的模长代表着预测出的要找的东西确实存在的概率。如上图是控制方向的capsule(即一个组件),蓝色箭头和黑色箭头,如果要组合成一个帆船,两个箭头有多种旋转的组合,最匹配当前image的就是activations中最长的两个箭头。当然除了旋转角度还可以有很多其他种,比如对象的大小,如何延伸,如何扭曲等等,即很多Capsules去组合更复杂的结果。

首先比较一下传统神经网络和胶囊的区别:

  • Neuron:output a value。每个Neuron只做一件事,识别某个特定的区域,静态平移不变的。
  • Capsule:output a vector。而capsule想要识别某一类某一组件的特征表达,动态可组合的。
    在这里插入图片描述

在传统神经网络里,一个神经元一般会进行如下的标量操作:

  • 输入标量标量加权, W i x i W_ix_i Wixi
  • 对加权后的标量求和, ∑ W i x i \sum W_ix_i Wixi
  • 对和进行非线性变换生成新标量,Sigmoid,ReLU等等。

而在胶囊网络里面:

  • 输入向量与权重矩阵的矩阵乘法,泛函空间映射, u i = W i v i u_i=W_iv_i ui=Wivi。因为对于向量的矩阵变化是一种空间变化关系,通过W可以编码图像中低级特征和高级特征之间非常重要的空间关系。
  • 加权输入向量 c i u i c_iu_i ciui。这些权重决定当前胶囊将其输出发送到哪个更高级的胶囊(这个c就和神经网络里面的W很类似了,确定每个胶囊的权重),通过动态路由(dynamic routing)的过程完成的。
  • 对加权后的向量求和, s = ∑ c i u i s=\sum c_iu_i s=ciui。 这一点没什么差别。
  • 非线性化使用squashing函数生成新向量。该函数将向量进行压缩使得它的最大长度为1,最小长度为0,同时保持其方向不变。看图中的公式可以发现,在向量维度很长的时候它近乎于1,很短的时候近乎于0,这和Sigmoid函数很像,也不是线性变换的。

通过对比,最大的不同应该就是vector to vector(tensor to tensor)了,以及处理这种输入的动态路由。动态路由的流程示意图如下。
在这里插入图片描述
先看算法流程如下:

  • 对于底层的两个胶囊 v 1 v^1 v1 v 2 v^2 v2,先通过 W W W进行空间映射得到 u 1 u^1 u1 u 2 u^2 u2.
  • 然后利用 b 1 0 b_1^0 b10 b 2 0 b_2^0 b20计算权重 c 1 1 c^1_1 c11 c 2 1 c_2^1 c21,加和得到 s 1 s^1 s1
  • s 1 s^1 s1使用squashing激活就得到了 a 1 a^1 a1
  • 利用 a 1 a^1 a1更新 b 1 1 b_1^1 b11 b 2 1 b_2^1 b21,即 b i r = b i r − 1 + a r ⋅ u i b^r_i=b^{r-1}_i+a^r\cdot u^i bir=bir1+arui
  • 通过 b 1 1 b_1^1 b11 b 2 1 b_2^1 b21重复第二步,如图中的红线
  • 就得到下一次的 c 1 2 c^2_1 c12 c 2 2 c_2^2 c22,同样加和得到 s 2 s^2 s2
  • s 2 s^2 s2 也squashing得到 a 2 a^2 a2,同理得到 a 3 a^3 a3
  • a 3 a^3 a3即是更新后的新向量 v v v

这个过程看起来有些奇怪,但实际上不就是对每个底层胶囊计算一个softmax权重之后,再用类似RNN的循环操作不断的调整每个胶囊对结果的权重,这也就是“动态”的含义了。这里权重是基于一次结果的a与每个u的点积之后再softmax得到的(很像Attention),然后不断每次的调整。如果预测向量a与上层胶囊的u具有较大的内积(内积描述两个向量的相关度!),则存在自顶向下的反馈(相关度更高就应该加强这个方向的权重),所以就具有增加上层胶囊耦合系数,减小其他胶囊耦合系数的效果(softmax重新分配权重)。

直观来讲这样的处理,是第一层的胶囊试图预测下一层胶囊将要输出什么样的结果,所以不断更新b然后更新c的实质是学习到了部分与整体的关系(part-whole)(部分与整体这一点体现在,整体的结果与每个part胶囊的内积决定,这也就达成了不仅仅是学到图像中有什么组件,还想学到它们更为细致的关系),并自动地将学到的知识推广到不同的新场景中。

这种类似RNN串联的思路,使每次节点得到结果后,需要再回过头比较当前结果的平均方向(sum的整体)和各个节点的建议方向(部分)是否一致,即动态路由以决定重要程度,再通过激活函数表示能够学习到底层节点间的位置空间关系。其实这个更新和knn聚类很像,等于说离群的点就几乎没可能。

Capsules Network
完整的结构如下图。
首先由普通的Conv得到向量,然后直接reshape成多个(32个),即得到它们的“部分”,将这些part输出到caps胶囊网络中,用上面的方法进行更新和计算。对于minist任务来说,对每个数字的模式各设置一个cap胶囊,即图中10维的DigitCaps,最后使用向量模长代表概率(这也是squashing的结果需要设计在0-1之间)。
在这里插入图片描述
实际上最后还会有一个3层的FC做图像重构,然后loss由两部分得到 l o s s = l o s s m a r g i n + α l o s s r e c o n s t r u c t i o n loss=loss_{margin }+\alpha loss_{ reconstruction} loss=lossmargin+αlossreconstructionmargin loss就是强制使capsule之间的差别越来越大(如预测1的胶囊要和2的胶囊越大越好, ∣ ∣ L 2 ∣ ∣ ||L_2|| L2),而采用reconstruction重建损失的好处是可以强制网络保留所有重建图像所需要的信息(其实强烈怀疑capsule之所以work,这个重建loss作用很大)。
在这里插入图片描述
pytorch版本的实现代码如下:

import numpy as np

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
from torch.optim import Adam
from torchvision import datasets, transforms

USE_CUDA = True #gpu


#载入Mnist数据
class Mnist:
    def __init__(self, batch_size):
        dataset_transform = transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])

        train_dataset = datasets.MNIST('../data', train=True, download=True, transform=dataset_transform)
        test_dataset = datasets.MNIST('../data', train=False, download=True, transform=dataset_transform)
        
        self.train_loader  = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
        self.test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=True)


#按模型框架图,先由普通卷积层再PrimaryCaps,最后映射到DigitCaps。
#普通卷积层
class ConvLayer(nn.Module):
    def __init__(self, in_channels=1, out_channels=256, kernel_size=9):
        #9x9卷积,256个通道,输出的大小是20x20x256
        #大一些的感受野能在层数较少的情况下得到更多的信息
        super(ConvLayer, self).__init__()

        self.conv = nn.Conv2d(in_channels=in_channels,
                               out_channels=out_channels,
                               kernel_size=kernel_size,
                               stride=1
                             )

    def forward(self, x):
        return F.relu(self.conv(x))

#Primarycaps卷积
class PrimaryCaps(nn.Module):
    def __init__(self, num_capsules=8, in_channels=256, out_channels=32, kernel_size=9):
        #32个平行的卷积,每个数据为8个分量
        super(PrimaryCaps, self).__init__()

        self.capsules = nn.ModuleList([
            nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=2, padding=0) 
                          for _ in range(num_capsules)])
    
    def forward(self, x):
        u = [capsule(x) for capsule in self.capsules]#num_capsules个卷积层
        u = torch.stack(u, dim=1)
        u = u.view(x.size(0), 32 * 6 * 6, -1)#窗口大小是6x6
        return self.squash(u)#squash激活函数挤压向量
    
    def squash(self, input_tensor):
        #实现0-1的压缩,同时保持其方向不变
        squared_norm = (input_tensor ** 2).sum(-1, keepdim=True)
        output_tensor = squared_norm *  input_tensor / ((1. + squared_norm) * torch.sqrt(squared_norm))
        return output_tensor

#DigitCaps胶囊层,最后输出为1016分量的向量,分类结果是向量长度最大的输出
class DigitCaps(nn.Module):
    def __init__(self, num_capsules=10, num_routes=32 * 6 * 6, in_channels=8, out_channels=16):
        super(DigitCaps, self).__init__()

        self.in_channels = in_channels
        self.num_routes = num_routes
        self.num_capsules = num_capsules

        self.W = nn.Parameter(torch.randn(1, num_routes, num_capsules, out_channels, in_channels))

    def forward(self, x):
        #先计算中间向量u
        batch_size = x.size(0)
        x = torch.stack([x] * self.num_capsules, dim=2).unsqueeze(4)

        W = torch.cat([self.W] * batch_size, dim=0)
        u_hat = torch.matmul(W, x)#输入x通过W进行空间映射,编码图像中低级和高级特征之间的空间关系

        #b的初始化为0
        b_ij = Variable(torch.zeros(1, self.num_routes, self.num_capsules, 1))
        if USE_CUDA:
            b_ij = b_ij.cuda()

        #动态路由
        num_iterations = 3
        for iteration in range(num_iterations):
            c_ij = F.softmax(b_ij) #用b计算softmax的权重c
            c_ij = torch.cat([c_ij] * batch_size, dim=0).unsqueeze(4)

            s_j = (c_ij * u_hat).sum(dim=1, keepdim=True)#加权和
            v_j = self.squash(s_j)#当前迭代的输出
            
            if iteration < num_iterations - 1: #更新a和b
                a_ij = torch.matmul(u_hat.transpose(3, 4), torch.cat([v_j] * self.num_routes, dim=1))
                b_ij = b_ij + a_ij.squeeze(4).mean(dim=0, keepdim=True)

        return v_j.squeeze(1)#最后的输出
    
    def squash(self, input_tensor):
        squared_norm = (input_tensor ** 2).sum(-1, keepdim=True)
        output_tensor = squared_norm *  input_tensor / ((1. + squared_norm) * torch.sqrt(squared_norm))
        return output_tensor


#重构函数,强制网络保留所有重建图像所需要的信息
class Decoder(nn.Module):
    def __init__(self):
        super(Decoder, self).__init__()

        #从DigitCaps的16x10开始重建完整图片
        self.reconstraction_layers = nn.Sequential(
            nn.Linear(16 * 10, 512),
            nn.ReLU(inplace=True),
            nn.Linear(512, 1024),
            nn.ReLU(inplace=True),
            nn.Linear(1024, 784),
            nn.Sigmoid()
        )
        
    def forward(self, x, data):
        classes = torch.sqrt((x ** 2).sum(2))
        classes = F.softmax(classes)#最后输出的x向量最长的为最后的结果
        
        _, max_length_indices = classes.max(dim=1)
        masked = Variable(torch.sparse.torch.eye(10))#one-hot
        if USE_CUDA:
            masked = masked.cuda()
        masked = masked.index_select(dim=0, index=max_length_indices.squeeze(1).data)
        #3层FC做重建
        reconstructions = self.reconstraction_layers((x * masked[:, :, None, None]).view(x.size(0), -1))
        reconstructions = reconstructions.view(-1, 1, 28, 28)
        
        return reconstructions, masked

#CapsNet完整的流程
class CapsNet(nn.Module):
    def __init__(self):
        super(CapsNet, self).__init__()
        #由四个class组成
        self.conv_layer = ConvLayer()
        self.primary_capsules = PrimaryCaps()
        self.digit_capsules = DigitCaps()
        self.decoder = Decoder()
        
        self.mse_loss = nn.MSELoss()#均方差
        
    def forward(self, data):
        #三层的胶囊网络结构得到output
        output = self.digit_capsules(self.primary_capsules(self.conv_layer(data)))
        #用输出重建图像
        reconstructions, masked = self.decoder(output, data)
        return output, reconstructions, masked
    
    def loss(self, data, x, target, reconstructions):
        #完整的loss由margin和reconstruction两部分组成
        return self.margin_loss(x, target) + self.reconstruction_loss(data, reconstructions)
    
    def margin_loss(self, x, labels, size_average=True):
        #margin loss强制使capsule之间(如预测1和预测2)的差别越来越大
        batch_size = x.size(0)

        v_c = torch.sqrt((x**2).sum(dim=2, keepdim=True))#长度表示某个类别的概率

        #上边界和下边界
        left = F.relu(0.9 - v_c).view(batch_size, -1)
        right = F.relu(v_c - 0.1).view(batch_size, -1)

        #惩罚偏离边缘(错位的分类对边缘0.1 or 0.9的距离)
        #如果预测是0.8,label是1,那么loss是0.1很小
        #如果label是0,那么loss的惩罚要算与right的距离,其中0.5是downweight
        loss = labels * left + 0.5 * (1.0 - labels) * right
        loss = loss.sum(dim=1).mean()

        return loss
    
    def reconstruction_loss(self, data, reconstructions):
        loss = self.mse_loss(reconstructions.view(reconstructions.size(0), -1), data.view(reconstructions.size(0), -1))
        return loss * 0.0005 #这个系数为0.0005


capsule_net = CapsNet()
if USE_CUDA:
    capsule_net = capsule_net.cuda()
optimizer = Adam(capsule_net.parameters())#优化器


batch_size = 100
mnist = Mnist(batch_size)#导入数据

n_epochs = 30#周期

#开始训练
for epoch in range(n_epochs):
    capsule_net.train()#调到训练模式
    train_loss = 0
    for batch_id, (data, target) in enumerate(mnist.train_loader):

        target = torch.sparse.torch.eye(10).index_select(dim=0, index=target)#手写数字10维
        data, target = Variable(data), Variable(target)

        if USE_CUDA:#gpu
            data, target = data.cuda(), target.cuda()

        optimizer.zero_grad() #梯度清零
        output, reconstructions, masked = capsule_net(data) #得到模型输出
        loss = capsule_net.loss(data, output, target, reconstructions) #计算loss
        loss.backward() #反向传播
        optimizer.step() #参数更新

        train_loss += loss.data[0]#记录总loss
        
        if batch_id % 100 == 0: #定期打印结果
            print "train accuracy:", sum(np.argmax(masked.data.cpu().numpy(), 1) == 
                                   np.argmax(target.data.cpu().numpy(), 1)) / float(batch_size)
        
    print train_loss / len(mnist.train_loader)
        
    capsule_net.eval()#评估模式
    test_loss = 0
    for batch_id, (data, target) in enumerate(mnist.test_loader):

        target = torch.sparse.torch.eye(10).index_select(dim=0, index=target)
        data, target = Variable(data), Variable(target)

        if USE_CUDA:#gpu
            data, target = data.cuda(), target.cuda()

        output, reconstructions, masked = capsule_net(data)#得到评估结果
        loss = capsule_net.loss(data, output, target, reconstructions)#计算loss

        test_loss += loss.data[0]
        
        if batch_id % 100 == 0: #定期打印结果
            print "test accuracy:", sum(np.argmax(masked.data.cpu().numpy(), 1) == 
                                   np.argmax(target.data.cpu().numpy(), 1)) / float(batch_size)
    
    print test_loss / len(mnist.test_loader)


#可视化
import matplotlib
import matplotlib.pyplot as plt

def plot_images_separately(images):
    "Plot the six MNIST images separately."
    fig = plt.figure()
    for j in xrange(1, 7):
        ax = fig.add_subplot(1, 6, j)
        ax.matshow(images[j-1], cmap = matplotlib.cm.binary)
        plt.xticks(np.array([]))
        plt.yticks(np.array([]))
    plt.show()

plot_images_separately(data[:6,0].data.cpu().numpy())#原结果
plot_images_separately(reconstructions[:6,0].data.cpu().numpy())#重建结果

完整逐行代码解析::https://github.com/nakaizura/Source-Code-Notebook/tree/master/Capsules

Capsules的重点

  • 想学到具体的实体或者关系模式,等变性
  • 得到组件方向性,能动态的调整agreement routing
  • Margin + reconstruction

Capsules的优缺点
优点主要有3点:

  • 胶囊的输出只会被引导至合适的下一层胶囊,这些胶囊将会获得非常干净的输入信号,并且更加精确的特定对象的姿态。
  • 通过审视激活的路径,我们能清楚的观察到组件的层次结构。如下图,可以发现某些中间cap确实学习到了一些姿态信息,某些控制粗细,某些与倾斜度,方向有关等。
  • routing将会帮助解析拥有大量重叠在一起的对象所构成的拥挤场景或者暧昧不清。即overlapping handing,也是paper中的一个实验,如下下图,能比较好的显示出overlapping 的现象。在这里插入图片描述
    在这里插入图片描述

缺点是:

  • 训练非常的慢,最大原因是routing有内部循环。
  • 无论是什么类型的对象,在给定位置永远只有一个胶囊,所以它不能检测出非常靠近的同一类型的对象,这种效应叫“挤出效应”,在人类视觉中也有这种现象,所以其实不算是很大的问题。

Capsules的到底学习什么?
下图是李宏毅老师对invariance和equivariance的discusstion了。对于左边的图是普通的CNN经过max pooling的结果,对于不同的输入max的结果都是3,这种情况就容易导致在人眼镜,嘴巴等一些组件明明调换了,CNN却仍然能识别出是person的不合理现象,“i dont know the difference”。因为CNN想要学习到的是某一类整体的通用表示,不管什么样的图,都得到同样的结果就是最好的。

而对于右边capsule,输入的两个“1”的倾斜度是对称的,通过不同的cap得到的v是可以不一样的,这能包含一些姿态信息,但只有保证最后的结果||v||值类似的就行,“i know the difference,but i do not react to it”。
在这里插入图片描述
Capsules的本质是什么?
Hopping Memory Networks+ Attention(或 rnn)。毕竟每次都从前一次取值(memory)做调整(attention),而且多个(hopping)。
在这里插入图片描述

Capsules已经升级
从NeurIPS 2017 是关于路由。
ICLR 2018 使用了 EM 算法。
然后在 NeurIPS 2019 变成Stacked Capsule Auto-Encoders。

Matrix Capsules with EM Routing
使用 EM算法做动态路由。在Dynamic Routing Between Capsules中动态路由是用内积算相似度然后得到权重再分配的,而作者认为这种计算方法不能很好地区分“quite good”和“very good”的areement,所以改成 高斯混合原型聚类的log variance做为相似度(它是一个含有隐变量的多高斯生成模型,用EM进行参数估计)。在每对相邻的胶囊层之间使用路由过程。 对于卷积胶囊,层L + 1中的每个胶囊仅向层L中的接收场内的胶囊发送反馈。

另外还把capsule的表示形式为n维的vector(vector的每个维度表示一种特征,||v||模表示显著程度概率的大小)变成了n*n的姿态矩阵(pose matrix,可以学习表征该实体与观看者之间的关系),再另加一个scalar表示其activation。整个模型如下:
在这里插入图片描述
首先是5x5的CNN(图中的ReLU Conv1),然后紧跟主胶囊primaryCaps和另外两个胶囊ConvCaps1和ConvCaps2。PrimaryCaps和最初版的一样做分组卷积,ConvCaps是基于前面得到capsule的卷积层,最后得到class。 L i = ( m a x ( 0 , m − ( a t − a i ) ) ) 2 L_i=(max(0,m-(a_t-a_i)))^2 Li=(max(0,m(atai)))2“传播损失”来直接最大化目标类(at)的激活和其他类的激活之间的差距。

这些系数使用 EM 算法迭代式地更新,这样每一个 capsule 的输出都会被路由到上一层的一个 capsule,它会收到一组相似投票的集群。

为什么要高斯再EM?
为了推广到新的观点。即想通过寻找含有隐变量的模型表示来代表更高维的概念,如果多个底层capsule的点聚集在了一起,它们可能就是因为同一个更高维的概念所生成的。

Stacked Capsule Auto-Encoders
https://arxiv.org/pdf/1906.06818.pdf
首先要把之前的那些版本的胶囊网络的一切都忘了,它们都是错的,只有现在这个是对的。–Hinton…

之前的版本都用了判别式学习,即寻找「部件-整体」的关系,尝试把很多的部件进行拼接组合,预测组合是否是一个合理的整体。但用「部件-整体」关系的时候,如果部件的自由度比整体的自由度要少,好比部件是点,然后你要用点组成星座,那你很难从一个点的位置预测整个星座的位置,你需要用到很多点的位置;所以不能从单个部件出发对整体做预测。如何能用「整体-部件」关系就很好了。(果然无监督是未来。。。)
在这里插入图片描述
看论文名字,就是结合AE的无监督学习了。主要是设计了一个堆栈式胶囊自编码器(SCAE)。一开始先用贪婪的方法训练它 —— 从像素得到部件,从部件得到更大的部件,从更大的部件得到再大的部件。

  • 生成器:部件胶囊自编码器(PCAE)将图像分割为组成部分,推断其姿态,并将每个图像像素重建为变换组件模板的像素混合(高斯混合)。如上图从一个房子图片中得到一些部分结构的姿态(观察者和这些部件之间的关系,方向)。
  • 判别器:目标胶囊自编码器(OCAE)尝试将发现的部件及其姿态安排在一个更小的目标集合中。这个目标集合对每个部件进行预测,从而解释每个部件的姿态。如从姿态中尝试还原一些“积木”,并尝试寻找拼凑出一个完整的目标。
  • 通过将它们的姿态——目标-观察者关系(OV)和相关的目标-部件关系(OP)相乘,每个目标胶囊都会贡献这些混合的一部分。

需要说明的是,生成式模型里有两种思想。首先,每个低层次的胶囊只会被一个高层次胶囊解释 —— 这就形成了一个解析树,在解析树里每个元素只有一个父项。其次,低层次的胶囊的姿态可以从高层次胶囊推导得到,就是通过高层次胶囊相对于观察者的位姿和整体相对于部件的位姿做矩阵相乘,就得到了低层次胶囊相对于观察者的位姿。视觉里非常重要的两件事,处理视角变化,以及建立解析树,就这样设计到了模型里面。


非常全的胶囊网络资源:
https://zhuanlan.zhihu.com/p/34336279

Hinton AAAI2020 演讲:
https://www.sohu.com/a/372899758_651893


在这里插入图片描述

Efficient-Capsnet:capsule network with self-atention routing
补上一篇最新的升级版。这篇文章是在capsnet里面加入了注意力机制,主要是用 Self-Attention去有效地减少Capsnet的路由数量 。

模型架构如上图,比较不一样的就是在网络的最后一部分,加入了自注意力(蓝色方块),将低级胶囊路由到它们所代表的整体。

  • paper:https://arxiv.org/abs/2101.12491
  • codeh:ttps://github.com/EscVM/Efficient-CapsNet
Dynamic routing between capsules
11-28
Hinton2017最新论文,里面有胶囊神经元等概念,值得学习和思考
胶囊网络CapsulesNet)理解
luoxuexiong的博客
03-16 1万+
胶囊网络CapsulesNet)理解: 一.回顾CNN: CNN网络层级结构 CNN网络一共有5个层级结构: 输入层 卷积层 激活层 池化层 全连接FC层 1.输入层 与传统神经网络/机器学习一样,模型需要输入的进行预处理操作,常见的3中预处理方式有: 去均值 归一化 PCA/SVD降维等 2.卷积层 局部感知:人的大...
胶囊神经网络资源转载和Pytorch实现
PyBigStar的博客
12-13 826
胶囊神经网络资源转载 胶囊神经网络的简介, 介绍了CNN缺点以及为啥么出现胶囊神经网络 胶囊神经网络原理,用图像讲解 胶囊神经网络原理,有代码实现 胶囊神经网络动态路由算法
胶囊神经网络:Dynamic Routing Between Capsules,NIPS2017
qq_36618444的博客
04-01 1319
Introduction 本文的三位作者来自Google Brain,Toronto。 胶囊(Capsule)是一组神经元,其活动向量(activity vector)表示特定类型实体(如对象或对象部分)的实例化参数。换句话说,越低级的胶囊捕获越细粒度的特征。我们拿人脸来举例,轮廓、五官都可以被视为低级别的特征,被低级别的胶囊的活动向量所表示。当多个低级别的胶囊预测一致,激活更高级别的胶囊(比如,...
CapsNet模型:Dynamic Routing Between Capsules
ACM_hades的博客
06-19 590
1.CNN模型的缺陷 CNN主要用于捕捉图形的局部特征,但是在探索这些特征之间的关系似乎不是特别好(比如相对位置关系、相对大小关系,特征的方向等等关系) 如下面两幅图,由于局部特征相同,所以CNN可能将它们都识别成一张人脸: 一个简单的CNN模型可以正确地提取鼻子,眼睛和嘴巴的特征,但是并不能提取出特征之间的相对关系: CapsNet模型就是为解决CNN这个缺陷而产生的。 2.Capsules网络的概念 在一般的神经网络中,一层一般由若干神经元组成,每个神经元对应一个常数(或者叫常数的输出和输出)。
中文短文本分类实例十一-CapsuleNet胶囊网络Dynamic Routing Between Capsules
大漠帝国的博客
07-19 3307
一.概述 CapsuleNet(Dynamic Routing Between Capsules),胶囊网络,是Hinton等提出的新型图像人工神经网络模型,它主要解决了图像领域中maxpooling等信息丢失(比如说相对位置信息丢失的问题等)。 在图像处理领域,conv卷积层等提取图像初级特征,pooling层(最大池化、平均池化、k-max池化等)进行特征筛...
【CV】胶囊网络 CapsNet:胶囊之间的动态路由机制
stay hungry, stay foolish.
04-24 5782
论文年份:NeurIPS 2017,论文被引:3597(2022/04/23)
capsule系列之Dynamic Routing Between Capsules
AI蜗牛之家
02-26 3276
文章目录1.背景2.什么是capsule3.capsule原理和结构4.CapsNet模型介绍5.源码解析6.实验结果7.capsule相关论文参考文献 capsule在出现之后就除了Hinton老爷子的两个版本之外,还有例如Investigating Capsule Networks with Dynamic Routing for Text Classification这样的新作,可见cap...
Dynamic Routing Between Capsules(Hinton)
智商不够,时间来凑
09-16 1737
听了吴大大deep learning ai 课程对Hinton大牛研究的Capsules(胶囊)感兴趣。先挖个坑,以后有时间来填。
动态路由胶囊网络的tensorflow2实现
weixin_42906783的博客
12-29 3183
(作为一名研一学生,刚接触视觉处理4个月,如果说的或者代码有什么错误,还请谅解,帮我指正,多谢!) 胶囊网络是由Hiton在2017年提出,原文名为Dynamic Routing Between Capsules。该论文具体的内容和理解就不多说了,我最初也是从两个链接学习后,再看论文了解细节。不知道是不是我太菜了,Hiton的论文读起来比较费劲。 链接1:胶囊网络:更强的可解释性 - 知乎 (zhihu.com) 链接2:看完这篇,别说你还不懂Hinton大神的胶囊网络 (sohu.c...
Dynamic Routing Between Capsules
博客
01-07 357
Dynamic Routing Between CapsulesCNN 的局限性人类视觉识别CapsNets 到底是什么?路由协议(Routing by agreement)CapsNet背后的数学动态路由算法路由算法优势优点和缺点参考链接 Capsule是一组vector in vector out的神经元,每一个胶囊代表某一特定实体,如对象或对象部分.其向量模长代表实体存在概率,向量参数代表实...
Dynamic Routing Between Capsules 下载
10-28
9 月份,Axios 的一篇报道指出,Geoffrey Hinton 呼吁研究者们对反向传播保持怀疑态度,并准备在深度学习之上重构人工智能的理论体系。报道指出,他和其他两位研究者被 NIPS 2017 接收的论文《Dynamic Routing Between Capsules》正是 Hinton 对于未来人工智能形态的新探索。
Dynamic Routing Between Capsules - by.Hinton.2017
03-17
Code for this paper: http://bbs.pinggu.org/forum.php?mod=viewthread&tid=6214243&pid=49150963&page=1
万字胶囊网络超详细总结(原理加pytorch代码)
一只在cv道路上爬行的小乌龟~
05-24 1万+
1.胶囊网络概念与理解 1.1 胶囊网络概述 摘抄Hinton等人的《Transforming Autoencoders》关于胶囊概念理解如下: 人工神经网络不应当追求“神经元”活动中的视角不变性(使用单一的标量输出来总结一个局部池中的重复特征检测器的活动),而应当使用局部的“胶囊”,这些胶囊对其输入执行一些相当复杂的内部计算,然后将这些计算的结果封装成一个包含信息丰富的输出的小向量。每个胶囊学习辨识一个有限的观察条件和变形范围内隐式定义的视觉实体,并输出实体在有限范围内存在的概率及一组“实例参数”,实例
胶囊网络Capsule Network)的TensorFlow实现
热门推荐
新缸中之脑
12-05 3万+
胶囊网络Capsule Network)的TensorFlow实现 `Geoffrey Hinton`的胶囊网络(`Capsule Network`)震动了整个人工智能领域,它将卷积神经网络(CNN)的极限推到一个新的水平。本文使用谷歌的`Colaboratory`工具在`TensorFlow`上实现胶囊网络
胶囊网络CapsNet--dynamic routing between capsules
zephyr_wang的博客
07-17 715
1 简介 本文根据2017年Hinton的《dynamic routing between capsules》翻译总结。 近30年,语音识别主要使用高斯混合隐马尔可夫模型(HMM)作为输出分布。这些模型容易在小的计算机上训练学习,但他们有模型表达限制:one-of- n 表达存在指数性无效率。为了使HMM记忆的信息翻倍,我们需要使隐藏节点的数量取平方(2次方)。而对于循环神经网络,只需要相应翻倍增加隐藏神经元的数量,不是指数性增加。 现在卷积网络在物体识别领域占据了主导地位,其是否也存在指数性无效率。卷积网
dynamic routing between capsules
最新发布
03-16
动态路由是指在胶囊网络中,胶囊之间的连接是动态的,可以根据输入数据的不同而改变。这种动态路由可以使得胶囊网络更加灵活,能够适应不同的输入数据,并且能够自适应地调整胶囊之间的连接,从而提高网络的性能和准确性。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Multimodal Fusion(多模态融合) 159854
  • 强化学习(Q-Learning,Sarsa) 62490
  • Random Walk(随机游走) 52122
  • Hierarchical Clustering(层次聚类) 46740
  • Domain Adaptation(领域自适应,MMD,DANN) 31970

分类专栏

  • 深度学习 109篇
  • 推荐系统 39篇
  • 多媒体和多模态 33篇
  • 机器学习 24篇
  • 强化学习 8篇
  • 量化学习 4篇
  • 数据挖掘 6篇

最新评论

  • Vision MLP(MLP-Mixer,RepMLP,ResMLP,gMLP,aMLP)

    Better Rose: gMLP有代码吗

  • Domain Adaptation(领域自适应,MMD,DANN)

    lilbye: 请问可以交流一下吗?我发现我使用迁移学习后会使主要任务的损失变大

  • Multi-Label Image Classification(多标签图像分类)

    biubiu康: 想问下您现在了解这方面的内容了吗

  • Multimodal Fusion(多模态融合)

    bairenyi: 居然是2年多前的总结,很超前啊,厉害

  • ChatDoctor(LLM大模型用于医疗对话)

    L202010: 有源码和安装教程吗

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 基于LLMs的多模态大模型(PALM-E,ArtGPT-4,VPGTrans )
  • 基于LLMs的多模态大模型(MiniGPT-4,LLaVA,mPLUG-Owl,InstuctBLIP,X-LLM)
  • 基于LLMs的多模态大模型(Flamingo, BLIP-2,KOSMOS-1,ScienceQA)
2023年16篇
2022年21篇
2021年28篇
2020年37篇
2019年25篇
2018年8篇
2017年26篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司乌海阿里店铺运营报价石家庄关键词按天扣费哪家好坂田网站优化按天计费推荐朝阳模板网站建设观澜网站开发推荐潜江关键词排名包年推广多少钱铜仁网站推广哪家好大连建设网站价格武汉百度网站优化排名鞍山网络营销哪家好四平网站定制阳江网站推广方案报价淮南网站搜索优化报价张北网站搜索优化坪山网站改版价格铜陵关键词排名推荐内江优化报价那曲SEO按天计费百色网站搜索优化哪家好自贡百度网站优化哪家好杭州至尊标王价格衡水网络推广推荐安康模板推广张掖营销网站价格和县网站开发公司大运建站公司临汾网站推广价格台州网站优化排名毕节营销型网站建设公司醴陵网站seo优化推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化