【问题标题】:How can I use argsort in Keras如何在 Keras 中使用 argsort
【发布时间】:2018-06-30 16:33:43
【问题描述】:

我学习 ML,我使用开源 (blstm),我想添加一个 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 函数以及如何使用它?

【问题讨论】:

    标签: sorting lambda keras keras-layer


    【解决方案1】:

    如果您使用的是 tensorflow 后端,则可以通过 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]]
    

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2019-08-21
      • 2019-04-15
      • 2017-12-29
      • 2020-11-09
      相关资源
      最近更新 更多