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

Я сохранил обученную модель в тензорном потоке с помощью команды:

saver = tf.train.Saver()
ss = saver.save(sess, '/tmp/new_trained_model.ckpt')

Затем я загружаю модель с помощью команды:

imported_meta = tf.train.import_meta_graph("/tmp/new_trained_model.ckpt.meta")
imported_meta.restore(sess, tf.train.latest_checkpoint(checkpoint_dir="/tmp/,latest_filename="checkpoint"))

Теперь оценим точность следующим образом.используется функция:

    correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(one_hot_y, 1))
#logits come from the model,there is no error,so didn't post that code
    accuracy_operation = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    #saver = tf.train.Saver()

    def evaluate(X_data, y_data):
        num_examples = len(X_data)
        total_accuracy = 0
        sess = tf.get_default_session()
        for offset in range(0, num_examples, BATCH_SIZE):
            batch_x, batch_y = X_data[offset:offset+BATCH_SIZE], y_data[offset:offset+BATCH_SIZE]
            accuracy = sess.run(accuracy_operation, feed_dict={x: batch_x, y: batch_y, keep_prob: 1.0})
            total_accuracy += (accuracy * len(batch_x))
        return total_accuracy / num_examples
    test_accuracy = evaluate(X_test, y_test)

Но вышеприведенная функция выдает ошибку:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value Variable_12
     [[Node: Variable_12/read = Identity[T=DT_FLOAT, _class=["loc:@Variable_12"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](Variable_12)]]

Но, когда я печатаю тензоры из графика, она показывает матрицу Variable_12:

 from tensorflow.python.tools import inspect_checkpoint as chkp
    chkp.print_tensors_in_checkpoint_file("/tmp/new_trained_model.ckpt", tensor_name='',all_tensor_names='', all_tensors=True)

Переменная_12: (Показывает только одну переменную из выходных данных)

tensor_name:  Variable_12
    [[-0.1013797  -0.08079438 -0.05904691 ... -0.07798752 -0.08208387
      -0.18532619]
     [ 0.10919656 -0.06162841 -0.19453178 ... -0.03241748  0.1023232
       0.07120663]
     [-0.10920436  0.00233169 -0.08879709 ... -0.09918057 -0.02546161
       0.00903581]
     ...
     [ 0.13858072  0.13791025 -0.12322884 ... -0.15006843  0.00103891
       0.06663229]
     [-0.14043045  0.14039241  0.15048873 ...  0.07272678  0.00470365
       0.0273346 ]
     [-0.10976157 -0.10873327 -0.16460624 ... -0.16509598  0.1124685
      -0.08858881]]

Может ли кто-нибудь объяснить, почему отображается неинициализированная ошибка, когда есть значение, которое подтверждается inspect_checkpoint?

Спасибо за ваше время.

1 Ответ

0 голосов
/ 30 мая 2018

Кажется, проблема в том, что вы построили два вычислительных графика.

Сначала вы упомянули, что «выполнили часть, в которой была определена архитектура модели».Это создает график вычислений для вашей модели.

Затем вы также сделали

imported_meta = tf.train.import_meta_graph("/tmp/new_trained_model.ckpt.meta")

Это создает второй график вычислений для вашей модели.

В зависимости от того, как именно выВыполняя их, «графы вычислений» могут находиться в одном или двух отдельных объектах «Граф».В любом случае imported_meta.restore инициализировал переменные импортированного (второго) графа вычислений, но вы вызвали session.run(), чтобы вычислить тензор из первого графа вычислений.Никто не инициализировал переменные в первом графе вычислений.

Исправление не состоит в том, чтобы импортировать (мета) граф, если вы уже создали свой граф.Пока имена и формы переменных не изменились, вы можете просто использовать Saver для восстановления значений переменных без создания дополнительных переменных или операций.

...