Как сохранить модель, имеющую регуляризатор TensorFlow Probability?

Вопрос или проблема

Рассмотрим следующий минимальный VAE:

import tensorflow as tf
import tensorflow_probability as tfp

tfk = tf.keras
tfkl = tf.keras.layers
tfpl = tfp.layers
tfd = tfp.distributions

#Поддельный набор данных
cim = np.random.randint(2, size=(10,10))

#Параметры

vector_size = 10
input_shape = (vector_size,)
encoded_size = 3
latent_dim = 5

#Модель

prior = tfd.Independent(tfd.Normal(loc=tf.zeros(encoded_size), scale=1), reinterpreted_batch_ndims=1)
vae = tfk.Sequential([
    #Энкодер
    tfkl.InputLayer(input_shape=input_shape),    
    tfkl.Dense(
        tfpl.MultivariateNormalTriL.params_size(encoded_size),
        activation=None,
        use_bias = False
    ),
    tfpl.MultivariateNormalTriL(
        encoded_size,
        activity_regularizer=tfpl.KLDivergenceRegularizer(prior)
    ),
    #Декодер
    tfkl.Dense(
        units = vector_size, 
        activation = tf.nn.leaky_relu,
        use_bias = False
    )
])


vae.compile(optimizer=tf.optimizers.Adam(learning_rate=1e-3), loss="mse")
history = vae.fit(cim, cim, epochs = 1)

tf.saved_model.save(vae, './VAE')

Последняя строка вызывает ошибку: AttributeError: 'Tensor' object has no attribute 'log_prob'
При изучении проблемы выяснилось, что регуляризатор tfpl.KLDivergenceRegularizer(prior) не сериализуется корректно. Есть идеи, как сохранить эту модель с регуляризатором?

Одно из решений, которое я нашел, заключалось в сохранении модели в формате HD5. Это, похоже, обходит сериализацию регуляризатора: vae.save("./VAE.h5")

Вы также можете попробовать сохранить только веса: vae.save_weights("./VAE-weights")

.

Ответ или решение

Сохранение модели, которая использует регуляризатор из TensorFlow Probability, может представлять определенные сложности из-за особенностей сериализации. В частности, проблема в том, что использование tfpl.KLDivergenceRegularizer(prior) может вызывать ошибки сериализации. Если вы сталкиваетесь с ошибкой AttributeError: 'Tensor' object has no attribute 'log_prob', это связано с тем, что регуляризатор, основанный на вычислении вероятностных функций, не сериализуется корректно в формате SavedModel. Рассмотрим несколько решений для этой задачи.

Решения для сохранения модели:

  1. Сохранение в формате HDF5:

    Сохранение модели в формате HDF5 позволяет обойти проблему, поскольку HDF5 использует другую стратегию сериализации, в которой регуляризаторы обрабатываются иначе:

    vae.save("./VAE.h5")

    Этот подход сохраняет всю структуру модели, включая архитектуру, веса и конфигурацию обучения, без необходимости непосредственного сохранения регуляризатора.

  2. Сохранение только весов модели:

    Другим подходом является сохранение только весов модели. Это может быть полезно в случае, если вы хотите сохранить и затем загрузить только параметры модели, минуя сложности с регуляризаторами:

    vae.save_weights("./VAE-weights")

    Впоследствии вы сможете повторно создать архитектуру модели и загрузить в нее сохраненные веса.

Контекст и советы по оптимизации:

Для SEO-оптимизации и удобства использования важно структурировать контент с ясными заголовками и списками, что упрощает навигацию и чтение. Используйте ключевые слова и фразы, такие как "TensorFlow Probability", "регуляризатор", "сохранение модели" для улучшения видимости.

Важно учесть:

При использовании данных подходов для сохранения модели с регуляризаторами из TensorFlow Probability, может потребоваться повторное воссоздание элементов модели (например, регуляризаторов) перед загрузкой сохраненных файлов. Обратите внимание на тщательное документирование всех изменений в архитектуре и сохранении модели для облегчения последующей работы.

Заключение: для сохранения моделей с TensorFlow Probability регуляризаторами наиболее простым методом является использование HDF5 формата, однако, вы также можете экспериментировать с другими методами сохранения, учитывая специфичные требования вашего проекта.

Оцените материал
Добавить комментарий

Капча загружается...