Neural network 最大化keras LSTM中的最后一层
这个问题可能与特定的应用程序有关,但我被阻止了,我认为这是一个好问题。 假设我们在Keras中有一个LSTM,它是序列对序列,例如词性标记。最后一层给出了标签序列和每个标签的概率。考虑以下预测输出;Neural network 最大化keras LSTM中的最后一层,neural-network,keras,lstm,keras-layer,softmax,Neural Network,Keras,Lstm,Keras Layer,Softmax,这个问题可能与特定的应用程序有关,但我被阻止了,我认为这是一个好问题。 假设我们在Keras中有一个LSTM,它是序列对序列,例如词性标记。最后一层给出了标签序列和每个标签的概率。考虑以下预测输出; 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,
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。非常感谢您的帮助。您可以使用此稍加修改的采样功能:
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))
如果要设置轴的值,可以使用layers.core.Activation()
代替backend.softmax()
请注意,输出仍然是float的张量,而不是int的张量,但我不知道如何更改张量类型。它应该不会有太大区别。您可以使用这个稍加修改的采样函数版本:
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))
如果要设置轴的值,可以使用layers.core.Activation()
代替backend.softmax()
请注意,输出仍然是float的张量,而不是int的张量,但我不知道如何更改张量类型。这应该没什么区别。谢谢@gionni,是的,我正在寻找tensor版本的实现,因为我是在Keras中实现的。我觉得一旦在Keras中完成,它就会成为图表的一部分。谢谢@gionni,是的,我正在寻找tensor版本的实现,因为我在Keras中做这件事。我觉得一旦在Keras中完成,它就会成为图表的一部分。