2

我按照本教程构建了一个编码器-解码器语言翻译模型,并为我的母语构建了一个。

现在我想保存它,部署在云 ML 引擎上并使用 HTTP 请求进行预测。

我找不到有关如何保存此模型的明确示例,

我是 ML 新手,发现TF save guide v 令人困惑..

有没有办法使用tf.keras.models.save_model 之类的东西来保存这个模型

4

3 回答 3

0

我知道我来晚了,但遇到了同样的问题(有关更多详细信息,请参阅如何使用 TensorFlow 保存编码器-解码器模型?)并找到了解决方案。这有点hacky,但它有效!

第 1 步 - 保存模型

保存您的分词器(如果适用)。然后单独保存用于训练数据的模型的权重(在此处命名层会有所帮助)。

# Save the tokenizer
with open('tokenizer.pickle', 'wb') as handle:
    pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)

# save the weights individually
for layer in model.layers:
    weights = layer.get_weights()
    if weights != []:
        np.savez(f'{layer.name}.npz', weights)

第 2 步 - 重新加载权重

您将需要重新加载标记器(如适用),然后加载您刚刚保存的权重。加载的权重采用某种npz格式,因此不能直接使用,但非常简短的文档将告诉您有关此文件类型所需了解的所有信息https://numpy.org/doc/stable/reference/generated/numpy。保存.html

# load the tokenizer
with open('tokenizer.pickle', 'rb') as handle:
    tokenizer = pickle.load(handle)

# load the weights
w_encoder_embeddings = np.load('encoder_embeddings.npz', allow_pickle=True)
w_decoder_embeddings = np.load('decoder_embeddings.npz', allow_pickle=True)
w_encoder_lstm = np.load('encoder_lstm.npz', allow_pickle=True)
w_decoder_lstm = np.load('decoder_lstm.npz', allow_pickle=True)
w_dense = np.load('dense.npz', allow_pickle=True)

第 3 步 - 重新创建您的训练模型并应用权重

您需要重新运行用于创建模型的代码。就我而言,这是:

encoder_inputs = Input(shape=(None,), name="encoder_inputs")
encoder_embeddings = Embedding(vocab_size, embedding_size, mask_zero=True, name="encoder_embeddings")(encoder_inputs)

# Encoder lstm
encoder_lstm = LSTM(512, return_state=True, name="encoder_lstm")
encoder_outputs, state_h, state_c = encoder_lstm(encoder_embeddings)

# discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(None,), name="decoder_inputs")

# target word embeddings
decoder_embeddings = Embedding(vocab_size, embedding_size, mask_zero=True, name="decoder_embeddings")
training_decoder_embeddings = decoder_embeddings(decoder_inputs)

# decoder lstm
decoder_lstm = LSTM(512, return_sequences=True, return_state=True, name="decoder_lstm")
decoder_outputs, _, _ = decoder_lstm(training_decoder_embeddings,
                                     initial_state=encoder_states)

decoder_dense = TimeDistributed(Dense(vocab_size, activation='softmax'), name="dense")
decoder_outputs = decoder_dense(decoder_outputs)

# While training, model takes input and traget words and outputs target strings
loaded_model = Model([encoder_inputs, decoder_inputs], decoder_outputs, name="training_model")

现在您可以将保存的权重应用于这些图层!需要稍微调查一下哪个权重到哪个层,但是通过命名你的层和检查你的模型层,这会变得容易得多model.layers

# set the weights of the model

loaded_model.layers[2].set_weights(w_encoder_embeddings['arr_0'])
loaded_model.layers[3].set_weights(w_decoder_embeddings['arr_0'])
loaded_model.layers[4].set_weights(w_encoder_lstm['arr_0'])
loaded_model.layers[5].set_weights(w_decoder_lstm['arr_0'])
loaded_model.layers[6].set_weights(w_dense['arr_0'])

第 4 步 - 创建推理模型

最后,您现在可以基于此训练模型创建推理模型!在我的情况下,这又是:

encoder_model = Model(encoder_inputs, encoder_states)

# Redefine the decoder model with decoder will be getting below inputs from encoder while in prediction
decoder_state_input_h = Input(shape=(512,))
decoder_state_input_c = Input(shape=(512,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
inference_decoder_embeddings = decoder_embeddings(decoder_inputs)

decoder_outputs2, state_h2, state_c2 = decoder_lstm(inference_decoder_embeddings, initial_state=decoder_states_inputs)

decoder_states2 = [state_h2, state_c2]
decoder_outputs2 = decoder_dense(decoder_outputs2)

# sampling model will take encoder states and decoder_input(seed initially) and output the predictions(french word index) We dont care about decoder_states2
decoder_model = Model(
    [decoder_inputs] + decoder_states_inputs,
    [decoder_outputs2] + decoder_states2)

瞧!您现在可以使用之前训练的模型进行推理!

于 2021-11-28T09:51:14.393 回答
0

您可以将 Keras 模型保存为 Keras 的 HDF5 格式,请参阅:

https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model

您将需要执行以下操作:

import tf.keras
model = tf.keras.Model(blah blah)
model.save('my_model.h5')

如果您迁移到 TF 2.0,在 tf.keras 中构建模型并使用 TF SavedModel 格式进行部署会更加直接。这个 2.0 教程展示了使用预训练的 tf.keras 模型,以 SavedModel 格式保存模型,部署到云端,然后执行 HTTP 请求进行预测:

https://www.tensorflow.org/beta/guide/saved_model

于 2019-06-12T15:38:34.610 回答
0

打开会话后创建训练保护程序,训练完成后保存模型:

with tf.Session() as sess:
     saver = tf.train.Saver()
     # Training of the model
     save_path = saver.save(sess, "logs/encoder_decoder")
     print(f"Model saved in path {save_path}")
于 2018-12-19T22:06:29.503 回答