пытается загрузить файл весов, содержащий 2 слоя, в модель с 0 слоями - PullRequest
0 голосов
/ 06 марта 2020

Я использовал tf2.0, чтобы написать модель vae, и после того, как использовал обратные вызовы, чтобы сохранить вес модели. Но лучше я использую load_weights, он сказал, пытаясь загрузить файл веса, содержащий 2 слоя, в модель с 0 слоями. Я использовал больше решений, чтобы решить это, но эти неудачи. это мой код поезда

vae = VAE(5529,600,1024)
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
vae.compile(optimizer, loss=tf.keras.losses.MeanSquaredError())
callbacks = []
# save model
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath='%s/cp.weights.{epoch:03d}-{val_loss:.2f}.hdf5' % save_dir,save_weights_only=True,save_best_only=True,verbose=1)
callbacks.append(cp_callback)
vae.fit(train_dataset,validation_data=valid_dataset, epochs=2, callbacks=callbacks)

это мой код модели VAE

import tensorflow as tf

class Sampling(tf.keras.layers.Layer):
    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

class Encoder(tf.keras.layers.Layer):
    def __init__(self, latent_dim=600, intermediate_dim=1024, name='encoder', **kwargs):
        super(Encoder, self).__init__(name, **kwargs)
        self.dense_proj = tf.keras.layers.Dense(intermediate_dim, activation='relu')
        self.dense_mean = tf.keras.layers.Dense(latent_dim)
        self.dense_log_var = tf.keras.layers.Dense(latent_dim)        
        self.sampling = Sampling()

    def call(self, inputs):
        h1 = self.dense_proj(inputs)
        z_mean = self.dense_mean(h1)
        z_log_var = self.dense_log_var(h1)
        z = self.sampling((z_mean, z_log_var))
        return z_mean, z_log_var, z

class Decoder(tf.keras.layers.Layer):
    def __init__(self, original_dim, intermediate_dim=1024, name='decoder', **kwargs):
        super(Decoder, self).__init__(name,**kwargs)
        self.dense_proj = tf.keras.layers.Dense(intermediate_dim, activation='relu')
        self.dense_output = tf.keras.layers.Dense(original_dim, activation='sigmoid')

    def call(self, inputs):
        h1 = self.dense_proj(inputs)
        return self.dense_output(h1)

class VAE(tf.keras.Model):
    def __init__(self, original_dim, latent_dim=600, intermediate_dim=1024, name='VAE', **kwargs):
        super(VAE, self).__init__(name, **kwargs)
        self.original_dim = original_dim
        self.encoder = Encoder(latent_dim=latent_dim, intermediate_dim=intermediate_dim)
        self.decoder = Decoder(original_dim=original_dim, intermediate_dim=intermediate_dim)

    def call(self, inputs):
        z_mean, z_log_var, z = self.encoder(inputs)
        reconstructed = self.decoder(z)

        kl_loss = -0.5 * tf.reduce_sum(
            z_log_var-tf.square(z_mean)-tf.exp(z_log_var)+1
        )
        self.add_loss(kl_loss)
        return reconstructed

, и я использую этот способ, чтобы загрузить его

vae =VAE(original_dim=5529, latent_dim=600, intermediate_dim=1024)
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
vae.compile(optimizer, loss=tf.keras.losses.MeanSquaredError())
vae.load_weights('./cp.weights.002-0.91.hdf5')

тогда это мой ошибка

ValueError                                Traceback (most recent call last)
<ipython-input-39-b318cf8b65e4> in <module>
----> 1 vae.load_weights('./cp.weights.002-0.91.hdf5')

~/opt/anaconda3/envs/ehr/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py in load_weights(self, filepath, by_name)
    179         raise ValueError('Load weights is not yet supported with TPUStrategy '
    180                          'with steps_per_run greater than 1.')
--> 181     return super(Model, self).load_weights(filepath, by_name)
    182 
    183   @trackable.no_automatic_dependency_tracking

~/opt/anaconda3/envs/ehr/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/network.py in load_weights(self, filepath, by_name)
   1175         saving.load_weights_from_hdf5_group_by_name(f, self.layers)
   1176       else:
-> 1177         saving.load_weights_from_hdf5_group(f, self.layers)
   1178 
   1179   def _updated_config(self):

~/opt/anaconda3/envs/ehr/lib/python3.7/site-packages/tensorflow_core/python/keras/saving/hdf5_format.py in load_weights_from_hdf5_group(f, layers)
    675                      'containing ' + str(len(layer_names)) +
    676                      ' layers into a model with ' + str(len(filtered_layers)) +
--> 677                      ' layers.')
    678 
    679   # We batch weight value assignments in a single backend call

ValueError: You are trying to load a weight file containing 2 layers into a model with 0 layers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...