Tensorflowモデルの保存と読み込みでKerasエラーが発生する
私が取り組んでいるプロジェクトでは、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_objects
、load_model
関数のタグと関係があるのではないかと思いますが、実装方法が100%わかりません。
回答
このリンクを試してください https://github.com/keras-team/keras/issues/11418
を使用して問題を解決しているように見えるethanfowlerによる回答があります custom_objects
もう少し見て回り、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)