提取LSTM Keras细胞状态

3

我想知道在Keras中是否有可能提取训练模型后LSTM的最后一个单元状态。例如,在这个简单的LSTM模型中:

number_of_dimensions = 128
number_of_examples = 123456

input_ = Input(shape = (10,100,))
lstm, hidden, cell = CuDNNLSTM(units = number_of_dimensions, return_state=True)(input_)

dense = Dense(num_of_classes, activation='softmax')(lstm)

model = Model(inputs = input_, outputs = dense)
parallel_model = multi_gpu_model(model, gpus=2)
parallel_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])

# fit the model
parallel_model.fit(X1, onehot_encoded, epochs=100, verbose=1, batch_size = 128, validation_split = 0.2)

我尝试打印“cell”,但结果是

tf.Tensor 'cu_dnnlstm_2/strided_slice_17:0' shape=(?, 128) dtype=float32 

我想要将细胞状态作为一个形状为(样例数,维度数)或(123456,128)的numpy数组获取。在keras中是否有可能实现这一点?
谢谢!
2个回答

3
假设您正在使用 TensorFlow 作为后端,您可以在 TensorFlow 会话中专门运行 cell。例如:
from keras.layers import LSTM, Input, Dense
from keras.models import Model
import keras.backend as K
import numpy as np

number_of_dimensions = 128
number_of_examples = 123456

input_ = Input(shape=(10, 100,))
lstm, hidden, cell = LSTM(units=number_of_dimensions, return_state=True)(input_)
dense = Dense(10, activation='softmax')(lstm)
model = Model(inputs=input_, outputs=dense)

with K.get_session() as sess:
    x = np.zeros((number_of_examples, 10, 100))
    cell_state = sess.run(cell, feed_dict={input_: x})
    print(cell_state.shape)

1

我相信OP要求LSTM层的状态,而不是权重。 - pcko1
好的,我没有用原始问题的确切措辞回答。根据 https://keras.io/getting-started/faq/#savingloading-whole-models-architecture-weights-optimizer-state ,使用此方法还将保存优化器状态,那么这是否至少使我的答案准确度达到50%?! - Phil
不,LSTM的隐藏状态和单元状态不会与模型一起保存,只有优化器的状态会被保存。这并不是同一件事情。 - Björn Lindqvist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接