Menyimpan dan Memuat Hasil Model Tensorflow di Keras Error

Aug 20 2020

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 .h5file 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 .h5file,

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_objectstag untuk load_modelfungsi tersebut, tetapi saya tidak 100% yakin tentang cara menerapkannya.

Jawaban

John Aug 21 2020 at 20:55

Coba tautan ini https://github.com/keras-team/keras/issues/11418

Ada jawaban dari ethanfowler yang sepertinya menyelesaikan masalah dengan menggunakan custom_objects

AaronJones Sep 05 2020 at 01:54

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)