Bagaimana cara memuat model dari arsitektur saya?

Saya telah melakukan kode ini dan saya perlu memuat model agar berfungsi nanti, tetapi ketika saya mencoba menggunakan load_model() kesalahannya adalah Tidak ada model yang ditemukan di file konfigurasi. Dan ketika saya mencoba memuat bobot kesalahannya adalah Tidak dapat memuat bobot yang disimpan dalam format HDF5 ke dalam Model subkelas yang belum membuat variabelnya. Panggil Model terlebih dahulu, lalu muat bobotnya.

Ini kode saya

class Sampling(layers.Layer):
    """Uses (z_mean, z_log_var) to sample z, the vector encoding a digit."""

    def call(self, inputs):
        z_mean, z_log_var = inputs
        batch = tf.shape(z_mean)[0]
        dim = tf.shape(z_mean)[1]
        epsilon = tf.keras.backend.random_normal(shape=(batch, dim))
        return z_mean + tf.exp(0.5 * z_log_var) * epsilon

Saya mendefinisikan encoder dan decoder yang akan saya gunakan nanti

class VAE(keras.Model):
    def __init__(self, encoder, decoder, **kwargs):
        super(VAE, self).__init__(**kwargs)
        self.encoder = encoder
        self.decoder = decoder

    def train_step(self, data):
        if isinstance(data, tuple):
            data = data[0]
        with tf.GradientTape() as tape:
            z_mean, z_log_var, z = encoder(data)
            reconstruction = decoder(z)
            reconstruction_loss = tf.reduce_mean(
                keras.losses.binary_crossentropy(data, reconstruction)
            )
            reconstruction_loss *= 64 * 64 * 3
            kl_loss = 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)
            kl_loss = tf.reduce_mean(kl_loss)
            kl_loss *= -0.5
            total_loss = reconstruction_loss + kl_loss
        grads = tape.gradient(total_loss, self.trainable_weights)
        self.optimizer.apply_gradients(zip(grads, self.trainable_weights))
        return {
            "loss": total_loss,
            "reconstruction_loss": reconstruction_loss,
            "kl_loss": kl_loss,
        }
    
    def test_step(self, data):
        if isinstance(data, tuple):
            data = data[0]
        with tf.GradientTape() as tape:
            z_mean, z_log_var, z = encoder(data)
            reconstruction = decoder(z)
            reconstruction_loss = tf.reduce_mean(
                keras.losses.binary_crossentropy(data, reconstruction)
            )
            reconstruction_loss *= 64 * 64 * 3
            kl_loss = 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)
            kl_loss = tf.reduce_mean(kl_loss)
            kl_loss *= -0.5
            total_loss = reconstruction_loss + kl_loss
        grads = tape.gradient(total_loss, self.trainable_weights)
        self.optimizer.apply_gradients(zip(grads, self.trainable_weights))
        return {
            "loss": total_loss,
            "reconstruction_loss": reconstruction_loss,
            "kl_loss": kl_loss,
        }

Akhirnya beginilah cara saya menggunakannya dan membuat model

model_name = 'car_racing_VAE.h5'

vae = VAE(encoder, decoder)
vae.compile(optimizer=keras.optimizers.Adam(0.001))

checkpointer = keras.callbacks.ModelCheckpoint(filepath=model_name, monitor='val_loss', verbose=1, save_best_only=True, mode='min', save_freq='epoch')

history = vae.fit(train, train,
                epochs=150,
                batch_size = 128,
                shuffle=True,
                validation_data=(val, val), validation_batch_size=128,
                callbacks=[checkpointer])

Jadi, bagaimana cara memuat model dan menggunakannya nanti?

model = load_model(model_name)
vae.load_weights(model_name)

Tak satu pun dari mereka yang bekerja


person Marisol Rodriguez    schedule 18.11.2020    source sumber
comment
Jadi di mana jalur encoder Anda? Dan bisakah Anda melampirkan kesalahan yang Anda temui?   -  person dtlam26    schedule 18.11.2020
comment
apa jalur lengkap yang Anda gunakan untuk menyimpan model? Lihatlah lokasi itu dan lihat apakah file .h5 ada di sana.   -  person Gerry P    schedule 18.11.2020
comment
File .h5 adalah tempat proyeknya. Saya mencoba membuat folder dan menamainya jadi saya mencoba vae.load_weights(model_name) dan vae.load_weights('/tmp/my_model.h5'). Kesalahan yang saya dapatkan adalah Unable to load weights saved in HDF5 format into a subclassed Model which has not created its variables yet. Call the Model first, then load the weights. Atau No model found in config file. saat menggunakan model = load_model('my_model.h5')   -  person Marisol Rodriguez    schedule 18.11.2020


Jawaban (1)


Sesuai kesalahannya, sepertinya ada masalah dengan memuat model yang disimpan dari jalur.

Seperti yang disarankan oleh Gerry P dalam komentar, periksa lokasi model yang disimpan dan muat dari lokasi yang sama.

Anda dapat menggunakan kode di bawah ini untuk menghindari masalah lokasi.

#saving model
model = ...  # Get model 
model.save('path/to/location')

#loading the model back
from tensorflow import keras
model = keras.models.load_model('path/to/location')
person TFer    schedule 25.11.2020