Восстановление модели GPflow с помощью функции Mean не работает

Я успешно следую методике сохранения / восстановления моделей GPflow. Но теперь я наткнулся на загвоздку.

Когда я пытаюсь восстановить модель с помощью функции линейного среднего, восстановление завершается с ошибкой.

Я думаю, что проблема заключается в соглашении об именах объекта функции линейного среднего тензорного потока. Вышеупомянутый «-44dbadbb-0» является случайным и изменяется каждый раз при перестроении модели, поэтому, если я проверю имена тензоров при сохранении модели с помощью

from tensorflow.python.tools.inspect_checkpoint import print_tensors_in_checkpoint_file
print_tensors_in_checkpoint_file(file_name='./model.ckpt', tensor_name='', all_tensors=False)

Получаю возврат:

Linear-eeb5f9f3-0 / A / без ограничений (DT_DOUBLE) [1,1] Linear-eeb5f9f3-0 / b / без ограничений (DT_DOUBLE) [1] модель / X / dataholder (DT_DOUBLE) [15,1] model / Y / dataholder (DT_DOUBLE) [15,1] модель / ядро ​​/ ядра / 0 / lengthscales / без ограничений (DT_DOUBLE) [] model / kern / kernels / 0 / variance / без ограничений (DT_DOUBLE) [] model / kern / kernels / 1 / lengthscales / без ограничений (DT_DOUBLE) [] модель / ядро ​​/ ядра / 1 / дисперсия / без ограничений (DT_DOUBLE) [] модель / вероятность / дисперсия / без ограничений (DT_DOUBLE) []

Где линейная функция явно имеет другое имя, чем модель, которую пытается восстановить.

Я попытался исправить это, переименовав переменные перед восстановлением, но это не работает с тензорным потоком. Я также пробовал разные методы сохранения / восстановления, но потом у меня возникли проблемы с возможностью выборки из модели.

Сохранение модели


    import gpflow
    import numpy as np
    import random
    import tensorflow as tf

    # define data
    rng = np.random.RandomState(4)
    X = rng.uniform(0, 5.0, 15)[:, np.newaxis]
    Y = np.sin((X[:, 0] - 2.5) ** 2).reshape(len(X),1)

    # define the mean function
    mf = gpflow.mean_functions.Linear(np.ones((1,1)),np.zeros((1,)))

    # create the GP model
    with gpflow.defer_build():
        k = gpflow.kernels.Matern32(1)+gpflow.kernels.RBF(1)
        m = gpflow.models.GPR(X, Y, kern=k,name='model',mean_function=mf)
        m.likelihood.variance = 1e-03
        m.likelihood.trainable = False

    tf.global_variables_initializer()

    tf_session = m.enquire_session()
    m.compile( tf_session )

    gpflow.train.ScipyOptimizer().minimize(m)

    saver = tf.train.Saver()
    save_path = saver.save(tf_session, "./model.ckpt")
    print("Model saved in path: %s" % save_path)

Восстановление модели


    import gpflow
    import numpy as np
    import random
    import tensorflow as tf

    # define data
    rng = np.random.RandomState(4)
    X = rng.uniform(0, 5.0, 15)[:, np.newaxis]
    Y = np.sin((X[:, 0] - 2.5) ** 2).reshape(len(X),1)

    # define the mean function
    mf = gpflow.mean_functions.Linear(np.ones((1,1)),np.zeros((1,)))

    with gpflow.defer_build():
        k = gpflow.kernels.Matern32(1)+gpflow.kernels.RBF(1)
        m = gpflow.models.GPR(X, Y, kern=k,name='model',mean_function=mf)
        m.likelihood.variance = 1e-03
        m.likelihood.trainable = False

    # construct and compile the tensorflow session
    tf.global_variables_initializer()
    tf_session = m.enquire_session()
    m.compile( tf_session )

    saver = tf.train.Saver()

    save_path = saver.restore(tf_session, "./model.ckpt")
    print("Model loaded from path: %s" % save_path)

    m.anchor(tf_session)

Код вылетает на save_path = saver.restore(tf_session, "./model.ckpt") с ошибкой:

NotFoundError (см. Выше для трассировки): Key Linear-44dbadbb-0 / A / Unlimited не найден в контрольной точке ...


person dgilford    schedule 11.07.2019    source источник


Ответы (1)


defer_build() выполняет кучу вещей, но одна часть построения всей модели (то есть графа тензорного потока) за один раз заключается в том, что все переменные тензорного потока и заполнители получают согласованные имена, причем все их имена относятся к имени самой модели (которая вы устанавливаете, передавая аргумент ключевого слова name='model' конструктору модели).

Однако в вашем коде функция Linear mean построена вне области defer_build(). Это означает, что gpflow должен сразу построить для него график, включая настройку переменных для параметров (в данном случае наклон и смещение). Все переменные тензорного потока находятся в глобальном пространстве имен, поэтому единственный способ разрешить создание более одного объекта - присвоить им рандомизированные имена. (Например, представьте, что вы хотите построить сумму двух ядер одного типа!)

К счастью, исправить это просто: просто переместите конструкцию функции mean в блок defer_build:

with gpflow.defer_build():
    # define the mean function
    mf = gpflow.mean_functions.Linear(np.ones((1,1)), np.zeros((1,)))

    k = gpflow.kernels.Matern32(1) + gpflow.kernels.RBF(1)
    m = gpflow.models.GPR(X, Y, kern=k, mean_function=mf, name='model')
    m.likelihood.variance = 1e-03
    m.likelihood.trainable = False

# construct and compile the tensorflow session
tf.global_variables_initializer()
tf_session = m.enquire_session()
m.compile(tf_session)

Если вы сделаете это как в сценариях «сохранить», так и в сценариях «загрузка», все будет работать и, надеюсь, так, как вы этого ожидаете. Надеюсь это поможет!

person STJ    schedule 11.07.2019