Python KMax 池化 (MXNet)

标签 python neural-network deep-learning conv-neural-network mxnet

我正在尝试在 this paper 中重新创建字符级 CNN并且在我需要创建 k-max 池化层的最后一步有点卡住,因为我使用的是 MXNet 但它没有这个。

An important difference is also the introduction of multiple temporal k-max pooling layers. This allows to detect the k most important features in a sentence, independent of their specific position, preserving their relative order.

然而,MXNet 确实有能力 add a new-op我一直在尝试这样做(尽管在给定过滤器和批量大小的情况下,对数据的形状有点困惑)。

传入数据的形状:

128 (min-batch) x 512 (number of filters) x 1 (height) x 125 (width)

出来的数据形状(k-max pooling,k = 7):

128 (min-batch) x 512 (number of filters) x 1 (height)  x 7 (width)

到目前为止我的想法......:

class KMaxPooling(mx.operator.CustomOp):
    def forward(self, is_train, req, in_data, out_data, aux):
        # Desired (k=3):
        # in_data = np.array([1, 2, 4, 10, 5, 3])
        # out_data = [4, 10, 5]
        x = in_data[0].asnumpy()
        idx = x.argsort()[-k:]
        idx.sort(axis=0)
        y = x[idx]

但是,我不确定几件事:

  1. 如何测试这是否有效(一旦我有一些完整的代码)
  2. 尺寸应该是多少?我在最后一个维度上排序(轴=0)
  3. 如何处理 backward() 函数,即梯度传播
  4. 这是否适用于 GPU - 我猜我将不得不用 C/cuda 重写它?

我从其他人那里为 keras 找到了这个示例(但没有代表链接):

import numpy as np
import theano.tensor as T
from keras.layers.core import MaskedLayer

class KMaxPooling(MaskedLayer):
    def __init__(self, pooling_size):
        super(MaskedLayer, self).__init__()
        self.pooling_size = pooling_size
        self.input = T.tensor3()

    def get_output_mask(self, train=False):
        return None

    def get_output(self, train=False):
        data = self.get_input(train)
        mask = self.get_input_mask(train)

        if mask is None:
            mask = T.sum(T.ones_like(data), axis=-1)
        mask = mask.dimshuffle(0, 1, "x")

        masked_data = T.switch(T.eq(mask, 0), -np.inf, data)

        result = masked_data[T.arange(masked_data.shape[0]).dimshuffle(0, "x", "x"),
                             T.sort(T.argsort(masked_data, axis=1)[:, -self.pooling_size:, :], axis=1),
                             T.arange(masked_data.shape[2]).dimshuffle("x", "x", 0)]

最佳答案

事实上,到目前为止,Mxnet 中还没有 KMaxPooling 支持,实现起来可能很棘手。但是,如果您决定实现它,我可以想出一些可以帮助您的提示:

  1. 如果您使用 Gluon,那么您可以将 KMaxPooling 实现为 HybridBlock,然后使用 HybridSequential运行它。只要您使用提供的函数作为参数“F”-backend(避免使用 numpy),您就可以在 GPU 上运行您的代码。所以,你不需要做 C++。

  2. 仅使用“F”后端的 HybridBlock 和函数也将解决反向传播的问题。您基本上不需要编写它,因为 Autograd 会为您完成。

  3. 使用 HybridBlock,您可以更轻松地调试代码。您只是不调用 net.hybridize() 方法,您会得到“nd”-backend,它比“sym”-backend 慢,但允许您使用调试器。

  4. 关于维度,如果您注意到 Gluon 中有不同版本的 MaxPool block :MaxPool1D、MaxPool2D、MaxPool3D。您只能为您的案例实现 1 个 KMaxPool1D。然后,您将堆叠 KMaxPool1D 的输出,就像应用了多个过滤器一样,本质上是将值添加到“z”维度的末尾。

希望对您有所帮助。

关于Python KMax 池化 (MXNet),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39216640/

相关文章:

python - 如何在Python中比较sql和json

python - 将 len 与 get() 函数一起使用会给出不正确的统计信息?

neural-network - 在神经网络中,偏差应该有动量项吗?

python - 仅使用 CPU 的 Ubuntu 16.04 中的 cntk 安装错误

python - windows环境下cygwin中无法运行pybot批处理文件

python - Django 管理员将变量传递给 base_site.html

numpy - 减少用于特征生成的预训练深度学习模型的大小

c++ - OpenCV::ML - 是否可以告诉 openCV 我们要将数据的哪些部分发送到哪个神经元?

python - 如何在tensorflow/keras中使用常量滤波器执行卷积

machine-learning - 在 Caffe 中使用可学习参数编写自定义 Python 层