Как правильно восстановить модель тензора ООП? - PullRequest
0 голосов
/ 04 июля 2018

Ради текущего проекта я решил определить модель тензорного потока в экземпляре класса. Все это работало хорошо, пока я не захотел восстановить его, чтобы продолжить обучение с последней контрольной точки. Это простая модель линейной регрессии, которая построена на инициализации экземпляра. Он пытается аппроксимировать функцию f(x) = 3x + 1.

Логика такова: если еще нет контрольной точки, создайте новую модель, обучите ее в течение 20 эпох, сохраните ее. Если контрольная точка уже есть, загрузите ее и продолжайте обучение с нее в течение 20 эпох.

Теперь изначально обучение сети работает. Но при попытке обучить его после загрузки он выдает следующую ошибку:

Файл "", строка 1, в runfile ('/ home / abc / tf_tests / restore_test / restoretest.py', wdir = '/ home / sku / tf_tests / restore_test')

Файл "/Home/abc/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", строка 710, в runfile execfile (имя файла, пространство имен)

Файл "/Home/abc/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", строка 101, в execfile exec (compile (f.read (), filename, 'exec'), пространство имен)

Файл "/home/sku/tf_tests/restore_test/restoretest.py", строка 71, в model.run_training_step (sess, x, y)

NameError: имя 'модель' не определено

Вопрос в том, как его восстановить и правильно продолжить обучение? Я нашел интересную статью об ООП здесь , но она не касается сохранения и восстановления моделей.

Мой код указан ниже. Спасибо за помощь!

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

class LinearModel(object):

    def __init__(self):
        self.build_model()

    def build_model(self):
        # x is input, y is output
        self.x = tf.placeholder(dtype=tf.float32, name='x')
        self.y = tf.placeholder(dtype=tf.float32, name='y')

        self.w = tf.Variable(0.0, name='w')
        self.b = tf.Variable(0.0, name='b')

        self.global_step = tf.Variable(0, trainable=False, name='global_step', dtype=tf.int32)

        self.y_pred = self.w * self.x + self.b

        # quadratic error as loss
        self.loss = tf.square(self.y - self.y_pred)

        self.train_op = tf.train.AdamOptimizer(0.001).minimize(self.loss)
        self.increment_global_step_op = tf.assign(self.global_step, self.global_step+1)

        return 

    # run a single (x, y) pair through the graph
    def run_training_step(self, sess, x, y):
        _, loss = sess.run([self.train_op, self.loss], feed_dict={self.x:x, self.y:y})
        return loss

    # convenience function for checking the values
    def get_vars(self, sess):
        return sess.run([self.w, self.b])


tf.reset_default_graph()

# training data generation, is a linear function of 3x+1 + noise
tr_input = np.linspace(-5.0, 5.0)
tr_output = 3*tr_input+1+np.random.randn(tr_input.shape[0])


with tf.Session() as sess:

    # check if there are checkpoints
    latest_checkpoint = tf.train.latest_checkpoint('./model_saves')

    # ADDED BY EDIT1
    model = LinearModel()

    # if there are, load them
    if latest_checkpoint:

        saver = tf.train.import_meta_graph('./model_saves/lin_model-20.meta')
        saver.restore(sess, latest_checkpoint)  

    # if not, create a new model
    else:

        ### REMOVED BY EDIT1
        ### model = LinearModel()
        sess.run(tf.global_variables_initializer())

        saver = tf.train.Saver()

    # show vars before doing the training
    w, b = model.get_vars(sess)       
    print("final weight: {}".format(w))
    print("final bias: {}".format(b))

    # train for 20 epochs and save it
    for epoch in range(20):
        for x, y in zip(tr_input, tr_output):
            model.run_training_step(sess, x, y)
        sess.run(model.increment_global_step_op)

    saver.save(sess, './model_saves/lin_model', global_step=model.global_step)       

    # show vars after doing the training
    w_opt, b_opt = model.get_vars(sess)       
    print("final weight: {}".format(w_opt))
    print("final bias: {}".format(b_opt))

РЕДАКТИРОВАНИЕ1:

При создании экземпляра модели перед проверкой наличия контрольной точки это приводит к ошибке предусловия переменной оптимизатора:

FailedPreconditionError: Попытка использовать неинициализированное значение beta1_power [[Узел: beta1_power / read = IdentityT = DT_FLOAT, _class = ["loc: @ Adam / Assign"], _device = "/ job: localhost / replica: 0 / task: 0 / device: GPU: 0"]] [[Node: Square / _25 = _Recvclient_terminated = false, recv_device = "/ работа: локальный / реплика: 0 / задача: 0 / устройства: CPU: 0", send_device = "/ работа: локальный / реплика: 0 / задача: 0 / устройства: GPU: 0", send_device_incarnation = 1, tenor_name = "edge_103_Square", tensor_type = DT_FLOAT, _device = "/ работа: локальный / реплика: 0 / задача: 0 / Устройство: ЦП: 0"]] ...

1 Ответ

0 голосов
/ 04 июля 2018

Вы не создали экземпляр своего класса LinearModel, когда пытались восстановить с контрольной точки. Это должно работать:

...
latest_checkpoint = tf.train.latest_checkpoint('/home/sku/tf_tests/restore_test/model_saves')

model = LinearModel()
saver = tf.train.Saver()

if latest_checkpoint:
    saver.restore(sess, latest_checkpoint)
else:
    sess.run(tf.global_variables_initializer())
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...