Menyimpan dan Memuat Hasil Model Tensorflow di Keras Error
Untuk proyek yang sedang saya kerjakan, saya telah membuat model sederhana di TensorFlow yang terdiri dari lapisan fitur padat diikuti oleh tiga lapisan padat.
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
Saya tidak dapat menjelaskan lebih detail tentang parameter arguments
, tetapi fungsi model di atas berfungsi dengan baik dan dapat melatih dan menyimpan .h5
file dengan baik menggunakan kode di bawah ini.
# Create a path for the saving location of the model
model_dir = log_dir + "\model.h5"
# Save the model
model.save(model_dir)
Namun, saat saya mencoba memuat model kembali dari .h5
file,
model = tf.keras.models.load_model(model_path)
Saya mendapatkan pesan kesalahan berikut.
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'
Melihat sekeliling, saya curiga itu ada hubungannya dengan custom_objects
tag untuk load_model
fungsi tersebut, tetapi saya tidak 100% yakin tentang cara menerapkannya.
Jawaban
Coba tautan ini https://github.com/keras-team/keras/issues/11418
Ada jawaban dari ethanfowler yang sepertinya menyelesaikan masalah dengan menggunakan custom_objects
Setelah melihat-lihat lebih banyak dan menggali beberapa masalah Github, saya yakin saya telah mengetahui masalah tersebut. Untuk situasi khusus saya, saya tidak perlu menyimpan seluruh model, bukan hanya bobotnya. Untuk konfigurasi saya, saya menggunakan Tensorflow 2.3.0 dan Keras 2.4.3.
JAWABAN SINGKAT:
Sesuaikan model Anda setidaknya untuk satu periode, lalu muat bobotnya.
JAWABAN PANJANG:
Untuk menyimpan bobot, saya menggunakan fungsi berikut yang ditambahkan dengan jalur file model saya di atasnya.
# Create a path for the saving location of the model
model_dir = dir_path + '/model.h5'
# Save the model
model.save_weights(model_dir)
Saya pertama kali membangun model saya dari pertanyaan saya di atas dan menyimpannya dalam objek model
model = build_model(arguments)
Saya menambahkan fungsi kerugian dan pengoptimal, lalu mengompilasi model saya untuk memastikan model tersebut memiliki semua fitur yang relevan sebelum memuat bobot.
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'])
Saya menemukan jawaban saya dari baris ini di sini , tetapi di bagian paling bawah dikatakan agar sesuai dengan model selama 1 periode sebelum memuat bobot.
history = model.fit(test_data, batch_size=1, epochs=1)
Setelah itu, Anda akan dapat memuat beban dengan baik menggunakan fungsi di bawah ini.
model.load_weights(model_path)