自定义池层-minmax池-Keras-Tensorflow

时间:2019-03-15 16:18:14

标签: tensorflow keras keras-layer max-pooling

我想定义我的自定义池层,而不是像MaxPooling层那样返回最大值,它将输出k个最大值和k个最小值。

我正在使用Tensorflow作为后端。 我需要对输出向量进行排序。

我正在考虑这样做:

from keras.layers.pooling import _Pooling1D

class MinMaxPooling1D(_Pooling1D):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MinMaxPooling1D, self).__init__(**kwargs)

    def _pooling_function(self, inputs, **kwargs):
        sorted_ = tf.contrib.framework.sort(inputs, axis = -1)
        print(sorted_)
        return np.concatenate((sorted_[:,:,:self.output_dim/2], sorted_[:,:,-self.output_dim/2:]))

但是我得到:

Tensor("min_max_pooling1d_1/sort/Neg_1:0", shape=(?, 1, 1, ?), dtype=float32)
ValueError: zero-dimensional arrays cannot be concatenated

将MinMaxPooling1D图层应用于(无,1、10)形状输出。

当时我正在考虑在MinMaxPooling1D层之前添加Flatten层,但是存在尺寸问题:

ValueError: Input 0 is incompatible with layer min_max_pooling1d_5: expected ndim=3, found ndim=2

2 个答案:

答案 0 :(得分:4)

因此,您要构建的是Keras图层,它将采用形状[batch_dim, pool_dim, channels]的3D输入并产生4D输出[batch_dim, pool_dim, channels, min_max_channels]

与Keras _Pooling1D不同,您实际上会更改尺寸数,我建议直接从keras Layer继承来实现图层。

使用call实施tf.sort方法,并从排序后的输入中获取所需数量的max和min元素,然后沿新维度将它们连接起来(考虑使用tf.expand_dims和{{ 1}})。

p.s。我尝试自己实现此功能,发现它很复杂。基本上,您需要与maxpool不同的东西,并且稍微复杂一些。您可能会看一下tf.concat方法tensorflow/python/ops/gen_nn_ops.py来了解您从事的工作是什么,除非您可以在某处找到一些现成的实现...

答案 1 :(得分:2)

我不是使用池化层,而是使用Lambda:

def top_k(inputs, k):
  return tf.nn.top_k(inputs, k=k, sorted=True).values

def least_k(inputs, k):
    return -tf.nn.top_k(-inputs, k=k, sorted = True).values

def minmax_k(inputs, k):
    return tf.concat([least_k(inputs, k), top_k(inputs, k)], axis = -1)

model = Sequential()
...
model.add(Lambda(minmax_k, arguments={'k': R}))