我按照本教程构建了一个编码器-解码器语言翻译模型,并为我的母语构建了一个。
现在我想保存它,部署在云 ML 引擎上并使用 HTTP 请求进行预测。
我找不到有关如何保存此模型的明确示例,
我是 ML 新手,发现TF save guide v 令人困惑..
有没有办法使用tf.keras.models.save_model 之类的东西来保存这个模型
我按照本教程构建了一个编码器-解码器语言翻译模型,并为我的母语构建了一个。
现在我想保存它,部署在云 ML 引擎上并使用 HTTP 请求进行预测。
我找不到有关如何保存此模型的明确示例,
我是 ML 新手,发现TF save guide v 令人困惑..
有没有办法使用tf.keras.models.save_model 之类的东西来保存这个模型
我知道我来晚了,但遇到了同样的问题(有关更多详细信息,请参阅如何使用 TensorFlow 保存编码器-解码器模型?)并找到了解决方案。这有点hacky,但它有效!
保存您的分词器(如果适用)。然后单独保存用于训练数据的模型的权重(在此处命名层会有所帮助)。
# 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)
您将需要重新加载标记器(如适用),然后加载您刚刚保存的权重。加载的权重采用某种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)
您需要重新运行用于创建模型的代码。就我而言,这是:
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'])
最后,您现在可以基于此训练模型创建推理模型!在我的情况下,这又是:
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)
瞧!您现在可以使用之前训练的模型进行推理!
您可以将 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 请求进行预测:
打开会话后创建训练保护程序,训练完成后保存模型:
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}")