我使用开源(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函数以及如何使用它?
答案 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]]