我怎样才能在Keras中使用argsort

时间:2018-01-22 04:56:22

标签: sorting lambda keras keras-layer

我使用开源(blstm)研究ML和我,我想添加一个argsort图层,但是keras没有argsort图层。

我搜索了这个问题,人们说使用Lambda函数。 (我使用Tensorflow后端) 但我不知道如何定义功能以及如何使用它。

这是原始代码:

tagger = Dropout(self.dropout_ratio)(tagger)
prediction = TimeDistributed(Dense(self.output_vocab_size, 
activation='softmax'))(tagger)
self.model = Model(input=raw_current, output=prediction)
self.model.compile(loss='categorical_crossentropy', optimizer=opt_func)

预测形状是(?,48,224)。

在追踪之后,当我测试这个模型时,我想从预测[0] [ - 1]获得top_10索引,所以我使用了一些排序代码。
这是我的测试代码。

prediction = self.model.predict(test_batch_data)
my_prediction = prediction[0][-1]
top10_my_prediction_idx = sorted(range(len(rule_prediction)), key=lambda k: rule_prediction[k] , reverse=True)[0:10]

我希望在训练模型时在预测图层之后添加一个get_top_10图层。

喜欢这个:

tagger = Dropout(self.dropout_ratio)(tagger)
prediction = TimeDistributed(Dense(self.output_vocab_size, activation='softmax'))(tagger)
**top10_prediction = Lambda(get_top10_prediction)**
self.model = Model(input=raw_current, output=prediction)
self.model.compile(loss='categorical_crossentropy', optimizer=opt_func)

如何定义Lambda函数以及如何使用它?

1 个答案:

答案 0 :(得分:1)

如果您正在使用张量流后端,则可以通过tf.nn.top_k函数使用sorted=True参数对张量进行arg排序。 lambda层将如下所示:

def top_k(input, k):
  # Can also use `.values` to return a sorted tensor
  return tf.nn.top_k(input, k=k, sorted=True).indices

...
sorted = Lambda(top_k, arguments={'k': 10})(prediction)

这是一个可运行的测试:

import numpy as np
import tensorflow as tf

from keras import Sequential
from keras.layers import Lambda

def top_k(input, k):
  return tf.nn.top_k(input, k=k, sorted=True).indices

model = Sequential()
model.add(Lambda(top_k, input_shape=(10,), arguments={'k': 10}))

data = np.array([
  [0, 5, 2, 1, 3, 6, 1, 2, 7, 4],
  [2, 4, 3, 1, 2, 0, 1, 5, 2, 4],
  [8, 9, 1, 8, 3, 0, 1, 3, 2, 6],
])

print(model.predict(x=data))
# Prints:
# [[8 5 1 9 4 2 7 3 6 0]
#  [7 1 9 2 0 4 8 3 6 5]
#  [1 0 3 9 4 7 8 2 6 5]]

参数k可以是小于您要排序的维度的任何值,例如,k=4输出将是:

[[8 5 1 9]
 [7 1 9 2]
 [1 0 3 9]]