Tensorflowモデルの保存と読み込みでKerasエラーが発生する

Aug 20 2020

私が取り組んでいるプロジェクトでは、TensorFlowで、密なフィーチャレイヤーとそれに続く3つの密なレイヤーで構成される単純なモデルを作成しました。

def build_model(arguments):
    model = tf.keras.Sequential([
        tf.keras.layers.DenseFeatures(arguments),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(5, activation='sigmoid')
    ])
    
    return model

パラメータについて詳しく説明することはできませんargumentsが、上記のモデル関数は完全に正常に機能.h5し、以下のコードを使用してファイルを完全にトレーニングおよび保存できます。

    # Create a path for the saving location of the model
    model_dir = log_dir + "\model.h5"

    # Save the model
    model.save(model_dir)

ただし、.h5ファイルからモデルを読み戻そうとすると、

model = tf.keras.models.load_model(model_path)

次のエラーメッセージが表示されます。

  File "sampleModel.py", line 342, in <module>
    model = tf.keras.models.load_model(model_path)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\save.py", line 1
82, in load_model
    return hdf5_format.load_model_from_hdf5(filepath, custom_objects, c
ompile)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\hdf5_format.py",
 line 178, in load_model_from_hdf5
    custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\model_config.py"
, line 55, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\layers\serialization.py
", line 175, in deserialize
    printable_module_name='layer')
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\utils\generic_utils.py"
, line 358, in deserialize_keras_object
    list(custom_objects.items())))
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\engine\sequential.py",
line 487, in from_config
    custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\layers\serialization.py
", line 175, in deserialize
    printable_module_name='layer')
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\utils\generic_utils.py"
, line 358, in deserialize_keras_object
    list(custom_objects.items())))
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\feature_column\base_fea
ture_layer.py", line 141, in from_config
    config['feature_columns'], custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 186, in deserialize_feature_columns
    for c in configs
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 186, in <listcomp>
    for c in configs
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 138, in deserialize_feature_column
    columns_by_name=columns_by_name)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\feature_column
_v2.py", line 2622, in from_config
    config['normalizer_fn'], custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 273, in _deserialize_keras_object
    obj = module_objects.get(object_name)
AttributeError: 'NoneType' object has no attribute 'get'

周りを見回すとcustom_objectsload_model関数のタグと関係があるのではないかと思いますが、実装方法が100%わかりません。

回答

John Aug 21 2020 at 20:55

このリンクを試してください https://github.com/keras-team/keras/issues/11418

を使用して問題を解決しているように見えるethanfowlerによる回答があります custom_objects

AaronJones Sep 05 2020 at 01:54

もう少し見て回り、Githubの問題を掘り下げた後、私はこの問題を理解したと思います。私の特定の状況では、重みだけでなく、モデル全体を保存する必要はありませんでした。私の構成では、Tensorflow2.3.0とKeras2.4.3を使用しています。

簡潔な答え:

モデルを少なくとも1つのエポックに適合させてから、ウェイトをロードします。

長い答え:

重みを保存するために、その上にモデルファイルパスを追加した次の関数を使用します。

# Create a path for the saving location of the model
model_dir = dir_path + '/model.h5'

# Save the model
model.save_weights(model_dir)

最初に上記の質問からモデルを作成し、モデルオブジェクトに保存します

model = build_model(arguments)

損失関数とオプティマイザーを追加し、モデルをコンパイルして、ウェイトをロードする前に、関連するすべての機能があることを確認します。

loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    
#Declare and set the parametors of the optimizer
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001, decay=0.001)
    
#Compile the model
model.compile(loss=loss_object, optimizer=optimizer, metrics=['accuracy'])

私はここでこの行から私の答えを見つけましたが、一番下には、ウェイトをロードする前に1エポックのモデルに合わせるように書かれています。

history = model.fit(test_data, batch_size=1, epochs=1)

その後、以下の関数を使用して、ウェイトを問題なくロードできるようになります。

model.load_weights(model_path)