如何 select keras 密集层的前 k 个元素?
How to select top-k elements of a keras dense layer?
我正在尝试执行 k-max pooling
以便 select top-k
个具有形状 (None, 30)
的密集元素。我尝试了一个 MaxPooling1D
层,但它不起作用,因为 keras 池化层至少需要一个 2d 输入形状。我正在使用以下 Lambda
图层,但出现以下错误:
layer_1.shape
(None, 30)
layer_2 = Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
sorted=True,
name="Top_k_final"))(layer_1)
Error: File
"/usr/local/lib/python3.5/dist-packages/keras/engine/base_layer.py",
line 474, in call
output_shape = self.compute_output_shape(input_shape) File "/usr/local/lib/python3.5/dist-packages/keras/layers/core.py", line
652, in compute_output_shape
return K.int_shape(x) File "/usr/local/lib/python3.5/dist-packages/keras/backend/tensorflow_backend.py",
line 591, in int_shape
return tuple(x.get_shape().as_list()) AttributeError: 'TopKV2' object has no attribute 'get_shape'
基于,我解决了这个问题。事实上,我通过添加 .values
从 tf.nn.top_k
获取张量值来解决问题,如下所示。但是我不确定我的解决方案是否正确。
layer_2 = Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
sorted=True,
name="Top_k_final").values)(layer_1)
我正在尝试执行 k-max pooling
以便 select top-k
个具有形状 (None, 30)
的密集元素。我尝试了一个 MaxPooling1D
层,但它不起作用,因为 keras 池化层至少需要一个 2d 输入形状。我正在使用以下 Lambda
图层,但出现以下错误:
layer_1.shape
(None, 30)
layer_2 = Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
sorted=True,
name="Top_k_final"))(layer_1)
Error: File "/usr/local/lib/python3.5/dist-packages/keras/engine/base_layer.py", line 474, in call output_shape = self.compute_output_shape(input_shape) File "/usr/local/lib/python3.5/dist-packages/keras/layers/core.py", line 652, in compute_output_shape return K.int_shape(x) File "/usr/local/lib/python3.5/dist-packages/keras/backend/tensorflow_backend.py", line 591, in int_shape return tuple(x.get_shape().as_list()) AttributeError: 'TopKV2' object has no attribute 'get_shape'
基于.values
从 tf.nn.top_k
获取张量值来解决问题,如下所示。但是我不确定我的解决方案是否正确。
layer_2 = Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
sorted=True,
name="Top_k_final").values)(layer_1)