如何将保存的模型转换或加载到 TensorFlow 或 Keras?

Posted

技术标签:

【中文标题】如何将保存的模型转换或加载到 TensorFlow 或 Keras?【英文标题】:How to convert or load saved model into TensorFlow or Keras? 【发布时间】:2020-02-29 07:20:25 【问题描述】:

我使用 tensorflow keras 创建了一个模型,并定义了一个回调来在每个 epoch 之后保存模型。它工作并以pb 格式保存模型,但我无法再次将其加载到 keras 中,因为 keras 只接受h5 格式。

我有两个问题:

除了 tensorflow 服务,我如何将保存的模型加载到 keras/tensorflow 中? 如何在每个 epoch 之后以 h5 格式保存 keras 模型?

我的回调和保存模型:

from tensorflow.keras.callbacks import ModelCheckpoint

cp_callback = ModelCheckpoint(filepath=checkpoint_path, save_freq= 'epoch', verbose=1 )

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X_train, y_train, epochs = 10, batch_size = 32, callbacks=[cp_callback])

我保存的模型结构:

saved_trained_10_epochs
├── assets
├── saved_model.pb
└── variables
    ├── variables.data-00000-of-00001
    └── variables.index

更新

我尝试如下使用latest_checkpoint,但出现以下错误:

from tensorflow.train import latest_checkpoint

loaded_model = latest_checkpoint(checkpoint_path)
loaded_model.summary()

错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-57-76a8ebe4f259> in <module>
----> 1 loaded_model.summary()

AttributeError: 'NoneType' object has no attribute 'summary'

在重新创建模型之后:

loaded_regressor = Sequential()

loaded_regressor.add(LSTM(units = 180, return_sequences = True, input_shape = (X_train.shape[1], 3)))
loaded_regressor.add(Dropout(0.2))

loaded_regressor.add(LSTM(units = 180, return_sequences = True))
loaded_regressor.add(Dropout(0.2))

loaded_regressor.add(LSTM(units = 180, return_sequences = True))
loaded_regressor.add(Dropout(0.2))

loaded_regressor.add(LSTM(units = 180, return_sequences = True))
loaded_regressor.add(Dropout(0.2))

loaded_regressor.add(LSTM(units = 180, return_sequences = True))
loaded_regressor.add(Dropout(0.2))

loaded_regressor.add(LSTM(units = 180))
loaded_regressor.add(Dropout(0.2))

loaded_regressor.add(Dense(units = 1))

loaded_regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
loaded_regressor.load_weights(latest_checkpoint(checkpoint_path))

错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-30-c344f1759d01> in <module>
     22 
     23 loaded_regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
---> 24 loaded_regressor.load_weights(latest_checkpoint(checkpoint_path))

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py in load_weights(self, filepath, by_name)
    160         raise ValueError('Load weights is not yet supported with TPUStrategy '
    161                          'with steps_per_run greater than 1.')
--> 162     return super(Model, self).load_weights(filepath, by_name)
    163 
    164   @trackable.no_automatic_dependency_tracking

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py in load_weights(self, filepath, by_name)
   1375             format.
   1376     """
-> 1377     if _is_hdf5_filepath(filepath):
   1378       save_format = 'h5'
   1379     else:

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py in _is_hdf5_filepath(filepath)
   1670 
   1671 def _is_hdf5_filepath(filepath):
-> 1672   return (filepath.endswith('.h5') or filepath.endswith('.keras') or
   1673           filepath.endswith('.hdf5'))
   1674 

AttributeError: 'NoneType' object has no attribute 'endswith'

【问题讨论】:

你究竟想如何加载模型? 你为什么不使用 tf.keras.models.load_model 来加载你的模型? 因为latest_checkpoint 是官方文档中建议的用于在训练期间保存和加载模型的方法,之后我检查了 Keras github repo 并将 pb 转换为 h5 是一个未解决的问题。我试过你的建议,效果很好,谢谢。请将其作为单独的答案发布,以便我接受。 【参考方案1】:

tf.keras 模型使用 tf.keras.models.load_model 加载,这应该可以正常工作,因为 tf.keras 支持读取/写入多种格式,包括 tensorflow 检查点。

【讨论】:

我尝试使用tf.keras.models.load_model('/home/ambigus9/models/research/my_model/exported_models/saved_model/') 并得到TypeError: 'module' object is not callable,知道为什么吗? 我也有同样的问题。 TensorFlow 2.3.1 我为这个问题开了一个新问题:***.com/questions/65105594/…

以上是关于如何将保存的模型转换或加载到 TensorFlow 或 Keras?的主要内容,如果未能解决你的问题,请参考以下文章

将 Keras 模型导入 TensorFlow.js

TensorFlow 从文件中保存/加载图形

如何将 Keras .h5 导出到 tensorflow .pb?

如何在 TensorFlow 2 中保存/加载模型的一部分?

如何将 TensorFlow 模型转换为 TFLite 模型

将保存的tensorflow模型转换为tensorflow Lite的正确方法是啥