最大化keras LSTM中的最后一层

时间:2017-06-28 22:04:04

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

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

wxc

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

现在我想做的是将此序列更改为以下内容。

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]]

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

1 个答案:

答案 0 :(得分:3)

您可以使用此略微修改的采样函数版本:

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))

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

请注意,输出仍然是float的张量,而不是int,但我无法找到如何更改张量类型。它不应该有太大的不同。