Python 如何在Keras中仅获取序列模型的最后输出?
我在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
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好吧,我不知道你的确切意思,因为它已经应用于所有时间步长。