Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义池层-最小最大池-Keras-Tensorflow_Tensorflow_Keras_Keras Layer_Max Pooling - Fatal编程技术网

自定义池层-最小最大池-Keras-Tensorflow

自定义池层-最小最大池-Keras-Tensorflow,tensorflow,keras,keras-layer,max-pooling,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 = outp

我想定义我的自定义池层,而不是像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
MinMaxPoolg1d层应用于None、1、10形状输出

我当时正在考虑在MinMaxPoolg1d之前添加一个展平层,但随后出现了一个维度问题:

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

因此,您要构建的是一个Keras层,该层将接受形状的3D输入[batch\u dim,pool\u dim,Channel],并生成4D输出[batch\u dim,pool\u dim,Channel,min\u max\u Channel]

与Keras _Poolg1d不同,您将实际更改维度的数量,我建议通过直接从Keras层继承来实现您的层

使用TF.CORE实现调用方法,从排序的输入中获取期望的最大和最小元素,并将它们连接在一个新的维度上,考虑使用TF.ExpExpDIMS和TF.CONTA.


p、 我自己也尝试过实现这一点,发现它很复杂。您基本上希望与maxpool有所不同,甚至更多。你可以看看tensorflow/python/ops/gen_nn_ops.py method max_pool来了解你在做什么样的工作,除非你能在某处找到一些现成的实现…

所以你想要构建的是一个Keras层,它将接受形状的3D输入[batch_dim,pool_dim,Channel],并产生4D输出[批处理尺寸、池尺寸、通道、最小最大通道]

与Keras _Poolg1d不同,您将实际更改维度的数量,我建议通过直接从Keras层继承来实现您的层

使用TF.CORE实现调用方法,从排序的输入中获取期望的最大和最小元素,并将它们连接在一个新的维度上,考虑使用TF.ExpExpDIMS和TF.CONTA.


p、 我自己也尝试过实现它,发现它很复杂。你基本上想要的是与maxpool不同的东西,甚至更多。你可以看看tensorflow/python/ops/gen_nn_ops.py method max_pool来了解你在做什么工作,除非你能在某处找到现成的实现…

我使用的不是池层,而是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}))

我使用的不是池层,而是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}))