Восстановление модели GPflow с помощью функции Mean не работает - PullRequest
0 голосов
/ 11 июля 2019

Я успешно следую методологии сохранения / восстановления моделей 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 / держатель данных (DT_DOUBLE) [15,1]модель / Y / держатель данных (DT_DOUBLE) [15,1] модель / ядро ​​/ ядра / 0 / длина шкалы / без ограничений (DT_DOUBLE) [] модель / ядро ​​/ ядра / 0 / дисперсия / без ограничений (DT_DOUBLE) [] модель / ядро ​​/ ядра/ 1 / длина шкалы / без ограничений (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 (см. Выше для отслеживания): ключ Linear-44dbadbb-0 / A / без ограничений не найден в контрольной точке ...

1 Ответ

0 голосов
/ 11 июля 2019

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

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

К счастью, это легко исправить: просто переместите построение средней функции в блок 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)

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

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