Тензорный поток: сохранение и восстановление сеанса

Я пытаюсь реализовать предложение из ответов: Tensorflow: как сохранить / восстановить модель?

У меня есть объект, который обертывает модель sklearn стиле sklearn .

 import tensorflow as tf class tflasso(): saver = tf.train.Saver() def __init__(self, learning_rate = 2e-2, training_epochs = 5000, display_step = 50, BATCH_SIZE = 100, ALPHA = 1e-5, checkpoint_dir = "./", ): ... def _create_network(self): ... def _load_(self, sess, checkpoint_dir = None): if checkpoint_dir: self.checkpoint_dir = checkpoint_dir print("loading a session") ckpt = tf.train.get_checkpoint_state(self.checkpoint_dir) if ckpt and ckpt.model_checkpoint_path: self.saver.restore(sess, ckpt.model_checkpoint_path) else: raise Exception("no checkpoint found") return def fit(self, train_X, train_Y , load = True): self.X = train_X self.xlen = train_X.shape[1] # n_samples = y.shape[0] self._create_network() tot_loss = self._create_loss() optimizer = tf.train.AdagradOptimizer( self.learning_rate).minimize(tot_loss) # Initializing the variables init = tf.initialize_all_variables() " training per se" getb = batchgen( self.BATCH_SIZE) yvar = train_Y.var() print(yvar) # Launch the graph NUM_CORES = 3 # Choose how many cores to use. sess_config = tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES, intra_op_parallelism_threads=NUM_CORES) with tf.Session(config= sess_config) as sess: sess.run(init) if load: self._load_(sess) # Fit all training data for epoch in range( self.training_epochs): for (_x_, _y_) in getb(train_X, train_Y): _y_ = np.reshape(_y_, [-1, 1]) sess.run(optimizer, feed_dict={ self.vars.xx: _x_, self.vars.yy: _y_}) # Display logs per epoch step if (1+epoch) % self.display_step == 0: cost = sess.run(tot_loss, feed_dict={ self.vars.xx: train_X, self.vars.yy: np.reshape(train_Y, [-1, 1])}) rsq = 1 - cost / yvar logstr = "Epoch: {:4d}\tcost = {:.4f}\tR^2 = {:.4f}".format((epoch+1), cost, rsq) print(logstr ) self.saver.save(sess, self.checkpoint_dir + 'model.ckpt', global_step= 1+ epoch) print("Optimization Finished!") return self 

Когда я запускаю:

 tfl = tflasso() tfl.fit( train_X, train_Y , load = False) 

Я получаю вывод:

 Epoch: 50 cost = 38.4705 R^2 = -1.2036 b1: 0.118122 Epoch: 100 cost = 26.4506 R^2 = -0.5151 b1: 0.133597 Epoch: 150 cost = 22.4330 R^2 = -0.2850 b1: 0.142261 Epoch: 200 cost = 20.0361 R^2 = -0.1477 b1: 0.147998 

Однако, когда я пытаюсь восстановить параметры (даже без уничтожения объекта): tfl.fit( train_X, train_Y , load = True)

Я получаю странные результаты. Прежде всего, загруженное значение не соответствует сохраненному.

 loading a session loaded b1: 0.1 <------- Loaded another value than saved Epoch: 50 cost = 30.8483 R^2 = -0.7670 b1: 0.137484 

Каков правильный способ загрузки и, возможно, сначала проверьте сохраненные переменные?

One Solution collect form web for “Тензорный поток: сохранение и восстановление сеанса”

TL; DR: вы должны попытаться переработать этот класс, чтобы self.create_network() был вызван (i) только один раз, и (ii) до того, как будет tf.train.Saver() .

Здесь есть две тонкие проблемы, связанные с структурой кода и поведением конструктора tf.train.Saver по tf.train.Saver . Когда вы строите заставку без аргументов (как в вашем коде), она собирает текущий набор переменных в вашей программе и добавляет ops к графу для сохранения и восстановления. В вашем коде, когда вы вызываете tflasso() , он будет строить заставку, и переменные не будут (потому что create_network() еще не вызывается). В результате контрольная точка должна быть пустой.

Вторая проблема заключается в том, что – по умолчанию – формат сохраненной контрольной точки – это карта от свойства имени переменной до ее текущего значения. Если вы создадите две переменные с тем же именем, они автоматически будут «uniquified» от TensorFlow:

 v = tf.Variable(..., name="weights") assert v.name == "weights" w = tf.Variable(..., name="weights") assert v.name == "weights_1" # The "_1" is added by TensorFlow. 

Следствием этого является то, что при вызове self.create_network() во втором вызове tfl.fit() переменные будут иметь разные имена из имен, которые хранятся в контрольной точке, или были бы, если бы заставка был построен после сети. (Вы можете избежать этого поведения, передав словарь Variable name в конструктор заставки, но это обычно довольно неудобно.)

Существует два основных способа обхода:

  1. В каждом вызове tflasso.fit() создайте всю модель заново, определив новый tf.Graph , затем в этом графе tf.train.Saver сеть и создайте tf.train.Saver .

  2. РЕКОМЕНДОВАНО Создайте сеть, затем tf.train.Saver в конструкторе tflasso и повторно используйте этот график для каждого вызова tflasso.fit() . Обратите внимание, что вам, возможно, потребуется сделать еще одну работу по реорганизации вещей (в частности, я не уверен, что вы делаете с self.X и self.xlen ), но это должно быть возможно для этого с помощью заполнителей и подачи.

  • Как использовать предварительно обработанную модель Word2Vec в Tensorflow
  • LSTM Autoencoder не работает, когда скрипт работает на более крупном наборе данных
  • Входы LSTM для Tensorflow
  • Как получить текущие доступные графические процессоры в тензорном потоке?
  • Эквивалент Theano.function в Tensorflow
  • Tensorflow: назначить несколько значений переменных в одном прогоне без пересчета других выражений
  • Как реализовать взвешенную кросс-энтропийную потерю в тензорном потоке, используя sparse_softmax_cross_entropy_with_logits
  • Процессы NVIDIA cuda GPU
  • Python - лучший язык программирования в мире.