【问题标题】:How to save Tensorflow encoder decoder model?如何保存 TensorFlow 编码器解码器模型?
【发布时间】:2019-05-20 09:33:28
【问题描述】:

我关注 this tutorial 构建编码器-解码器语言翻译模型并为我的母语构建了一个。

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

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

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

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

【问题讨论】:

  • 嗨@UpaJah,我不知道比your link 提供的方法更好。 keras 中没有提供一些重要的模型,例如编码器-解码器。因此,虽然 keras 为您完成会话工作,但在 tf 中您应该明确控制它。 Manual(这里解释了 Saver 类,你的链接也是如此)不是那么短,但如果你必须使用 tensorflow 就很好。当我被 tf 困住时,它对我有帮助
  • @MikhailStepanov 谢谢,我想我会使用 Tensorlflow 构建模型。
  • 嗨,@UpaJah。你想通了吗?我现在有同样的问题,正在寻找解决方案。你能给我一些建议吗?

标签: tensorflow keras google-cloud-ml encoder-decoder


【解决方案1】:

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

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}")

【讨论】:

  • 我使用的是tensorflow的eager模式,代码将如何工作?我想我需要在 Tensorflow graph 中再次编写代码
【解决方案2】:

您可以将 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

【讨论】:

    【解决方案3】:

    我知道我来晚了,但遇到了同样的问题(有关更多详细信息,请参阅 How do I save an encoder-decoder model with 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.savez.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)
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2020-09-26
      • 2019-07-07
      • 2021-03-25
      • 2021-11-10
      • 1970-01-01
      • 2021-08-22
      • 2019-09-11
      • 1970-01-01
      相关资源
      最近更新 更多