我能得到keras自定义层调用函数的中间参数吗?

2024-05-28 22:55:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究胶囊网络(CapsNet)深度学习模型,并尝试使用Keras在python中实现该模型。
胶囊网络的原始论文如下: Hinton等人,2017,胶囊之间的动态路由,arXiv https://arxiv.org/abs/1710.09829

我在这里引用了代码:https://keras.io/examples/cifar10_cnn_capsule/ 这段代码提供了一些在paper和Keras自定义层(它们定义了类胶囊)中使用的激活函数,它们继承了keras.layers.层在

Capsule net architecture

该模型由两个卷积层和一个完全连通层组成,由MNIST数据集训练而成。 在全连通层中,对8D矢量的卷积层变换和8D矢量与输出的16D矢量完全连通。 例如,6X6X256卷积层转换为(6X6X32)X8=1152 8D向量,称为初级胶囊向量。然后1152个8D向量与10个16D向量相连,称为DigitCaps。 在这个模型中,输出的不是10个标量值而是10个16D向量。向量的L2范数表示数据属于该类的概率。在

其中最重要的部分是初级胶囊载体与数码电容之间的“动态路由”部分。 让我们只考虑初级胶囊载体和一个数字帽之间的联系。1152个8D向量转换为1152个16D向量,这些1152个16D向量的加权和成为一个16D向量(DigitCaps)。 确定1152个向量的权重的部分是“动态路由”部分。权重称为“耦合系数” 在动态路由部分,对每个输入数据进行3次迭代训练以确定权重。经过3次迭代和权重确定后,1152个矢量成为一个16D矢量,并对所有10个16D矢量(DigitCaps)进行此过程。在

现在回到Keras中实现的过程,在前向传播过程中,计算所有1152个矢量,确定所有耦合系数,并计算所有的位数。最后,利用数字电容的L2范数和实际的y(class)计算损耗。因此,耦合系数可以看作是这一层的“中间参数”。在

  • 我的问题是,在Keras代码中,自定义调用函数,它们只返回输出的DigitCaps向量。但是我想知道当一个测试数据到来时,关于数据的训练耦合系数。在
  • 那么如何修改函数来得到耦合系数呢?
  • 换句话说,当测试输入到来时,如何修改call函数以获得该函数中的中间值?在

下面是类胶囊调用函数的代码。整个代码都在上面的链接中。在

    def call(self, inputs):
        """Following the routing algorithm from Hinton's paper,
        but replace b = b + <u,v> with b = <u,v>.

        This change can improve the feature representation of Capsule.

        However, you can replace
            b = K.batch_dot(outputs, hat_inputs, [2, 3])
        with
            b += K.batch_dot(outputs, hat_inputs, [2, 3])
        to realize a standard routing.
        """

        if self.share_weights:
            hat_inputs = K.conv1d(inputs, self.kernel)
        else:
            hat_inputs = K.local_conv1d(inputs, self.kernel, [1], [1])

        batch_size = K.shape(inputs)[0]
        input_num_capsule = K.shape(inputs)[1]
        hat_inputs = K.reshape(hat_inputs,
                               (batch_size, input_num_capsule,
                                self.num_capsule, self.dim_capsule))
        hat_inputs = K.permute_dimensions(hat_inputs, (0, 2, 1, 3))

        b = K.zeros_like(hat_inputs[:, :, :, 0])
        for i in range(self.routings):
            c = softmax(b, 1)
            o = self.activation(K.batch_dot(c, hat_inputs, [2, 2]))
            if i < self.routings - 1:
                b = K.batch_dot(o, hat_inputs, [2, 3])
                if K.backend() == 'theano':
                    o = K.sum(o, axis=1)
        return o

**我想得到每个样本的b值**

下面是利用胶囊层对cifar10数据进行keras建模的代码

^{pr2}$

Tags: 数据代码模型self路由hat矢量batch

热门问题