Python 如何在Keras中仅获取序列模型的最后输出?

Python 如何在Keras中仅获取序列模型的最后输出?,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我在Keras中使用return\u sequences=True和TimeDistributed包装器在最后一个密集层上训练了一个多对多序列模型: model = Sequential() model.add(Embedding(input_dim=vocab_size, output_dim=50)) model.add(LSTM(100, return_sequences=True)) model.add(TimeDistributed(Dense(vocab_size, activati

我在Keras中使用
return\u sequences=True
TimeDistributed
包装器在最后一个密集层上训练了一个多对多序列模型:

model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=50))
model.add(LSTM(100, return_sequences=True))
model.add(TimeDistributed(Dense(vocab_size, activation='softmax')))
# train...
model.save_weights("weights.h5")

因此,在训练期间,将计算所有隐藏状态(在每个时间戳中)的损失。但是对于推断,我只需要最后一个时间戳上的get输出。因此,我将权重加载到多对一序列模型中,以便在不使用
TimeDistributed
包装器的情况下进行推理,并设置
return\u sequences=False
以仅获取LSTM层的最后输出:

inference_model = Sequential()
inference_model.add(Embedding(input_dim=vocab_size, output_dim=50))
inference_model.add(LSTM(100, return_sequences=False))
inference_model.add(Dense(vocab_size, activation='softmax'))

inference_model.load_weights("weights.h5")

当我在长度为20的序列上测试我的推理模型时,我希望得到一个具有形状(vocab_大小)的预测,但是
推理模型。predict(…)
仍然返回每个时间戳的预测-形状张量(20,vocab_大小)

如果出于任何原因,在推理过程中只需要最后一个时间步,您可以构建一个新模型,该模型将经过训练的模型应用于输入,并使用
Lambda
层返回最后一个时间步作为其输出:

from keras.models import Model
from keras.layers import Input, Lambda

inp = Input(shape=put_the_input_shape_here)
x = model(inp) # apply trained model on the input
out = Lambda(lambda x: x[:,-1])(x)

inference_model = Model(inp, out)


旁注:如中所述,
时间分布(密集(…)
密集(…)
是等效的,因为
密集
层应用于其输入张量的最后一个维度。因此,这就是为什么您得到相同的输出形状。

如本文所述,
时间分布(稠密(…)
稠密(…)
是等效的,因为
稠密
层应用于其输入张量的最后一个维度。您确定没有将“样本”(维度0)与“时间步”(维度1)混淆吗?哦。有没有一种方法可以将TimeDistributed(稠密(…)应用于LSTM输出的每个时间戳?@nidomo好吧,我不知道你的确切意思,因为它已经应用于所有时间步长。