Rob*_*bin 1 keras tensorflow 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:]))
Run Code Online (Sandbox Code Playgroud)
但后来我得到:
Tensor("min_max_pooling1d_1/sort/Neg_1:0", shape=(?, 1, 1, ?), dtype=float32)
ValueError: zero-dimensional arrays cannot be concatenated
Run Code Online (Sandbox Code Playgroud)
MinMaxPooling1D 层应用于 (None, 1, 10) 形状输出。
我当时正在考虑在 MinMaxPooling1D 之前添加一个 Flatten 层,但随后有一个维度问题:
ValueError: Input 0 is incompatible with layer min_max_pooling1d_5: expected ndim=3, found ndim=2
Run Code Online (Sandbox Code Playgroud)
所以你想要构建的是一个 Keras 层,它将接受 3D 形状输入[batch_dim, pool_dim, channels]并产生 4D 输出[batch_dim, pool_dim, channels, min_max_channels]。
与 Keras 不同,_Pooling1D您实际上会更改维度数,我建议通过直接从 keras 继承来实现您的层Layer。
call使用tf.sort并从排序的输入中获取所需数量的 max 和 min 元素来实现该方法,并将它们沿新维度连接起来(考虑使用tf.expand_dims和tf.concat)。
ps 我曾尝试自己实现这一点,但发现它很复杂。您基本上想要与 maxpool 不同的东西,甚至更多。您可能会查看tensorflow/python/ops/gen_nn_ops.py方法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}))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2612 次 |
| 最近记录: |