我想重新創建this paper中的字符級CNN,並且在最後一步需要創建k-max池圖層,因爲我正在使用MXNet和它沒有這個。Python KMax Pooling(MXNet)
一個重要的不同之處還在於引入了多個時間的k-max池圖層。這允許檢測句子中最重要的k個特徵,獨立於它們的具體位置,保留它們的相對順序。
然而,MXNet確實有,我一直在努力做的,像這樣的能力,add a new-op(雖然獲得與數據的形狀有點糊塗了,定的過濾器和批量大小)。
在未來中的數據的形狀:
128 (min-batch) x 512 (number of filters) x 1 (height) x 125 (width)
數據中出來的形狀(K-MAX池中,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]
不過,我不知道幾件事情:
- 如何測試是否有效(一旦我有一些完整的代碼)
- 尺寸應該是什麼?我正在對最後一個維度進行排序(axis = 0)
- 如何處理落後()函數,即梯度傳播
- 這是否可以與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)]