【问题标题】:Maxing the last layer in keras LSTM最大化keras LSTM中的最后一层
【发布时间】:2017-06-28 22:04:04
【问题描述】:

这个问题可能与非常具体的应用程序相关,但我被阻止了,我认为这是一个问的好地方。 假设我们在 Keras 中有一个序列到序列的 LSTM,例如 Part of Speech Tagger。最后一层给了我标签序列和每个标签的概率。考虑以下预测输出;

A = [[0.1, 0.3, 0.2, 0.4],[0.2, 0.2, 0.2, 0.4],[0.5, 0.2, 0.1, 0.1]]

基本上这是一个长度为 3 的序列,在序列的每个时间点有 4 个可能的标签。

现在我想做的是把这个顺序改成下面的顺序。

A' = [[0, 0, 0, 1],[0, 0, 0, 1],[1, 0, 0, 0]]

换句话说,我想将一个放在最大概率的位置,并将所有其他的都更改为 0。非常感谢帮助。

【问题讨论】:

    标签: neural-network keras lstm keras-layer softmax


    【解决方案1】:

    您可以使用这个稍作修改的采样函数:

    def set_max_to_one(preds, temperature=0.01):
        preds = np.log(preds) / temperature
        exp_preds = np.exp(preds)
        preds = exp_preds.T / np.sum(exp_preds, axis=1)
        return preds.astype("int16").T
    

    这会返回您所期望的。您可以摆弄温度,使其稳定且不会返回 NA,但使用 0.01 应该就足够了。您可能还想更改输出数组的类型。

    请注意,如果您使用 numpy 数组对象,这将起作用,如果您想将其用于 keras 张量,则需要对其进行修改(例如考虑批量大小)。希望这会有所帮助

    编辑:

    这应该在 keras 中工作:

    import keras.backend as K
    
    def set_max_to_one(x, temperature=0.01):
        x = K.log(x)/temperature
        return K.round(K.softmax(x))
    

    如果您想设置axis 值,可以使用layers.core.Activation() 而不是backend.softmax()

    请注意,输出仍然是 float 的张量,而不是 int 的张量,但我不知道如何更改张量类型。应该没什么区别。

    【讨论】:

    • 谢谢@gionni,是的,我正在寻找张量版本的实现,因为我在 Keras 中这样做。我觉得一旦在 Keras 中完成,它就会成为图表的一部分。
    猜你喜欢
    • 2021-07-29
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2017-11-09
    相关资源
    最近更新 更多