TensorFlow, чому після збереження моделі залишаються 3 файли?


113

Прочитавши документи , я зберегла модель TensorFlow, ось мій демо-код:

# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
  sess.run(init_op)
  # Do some work with the model.
  ..
  # Save the variables to disk.
  save_path = saver.save(sess, "/tmp/model.ckpt")
  print("Model saved in file: %s" % save_path)

але після цього я виявив, що є 3 файли

model.ckpt.data-00000-of-00001
model.ckpt.index
model.ckpt.meta

І я не можу відновити модель відновленням model.ckptфайлу, оскільки такого файлу немає. Ось мій код

with tf.Session() as sess:
  # Restore variables from disk.
  saver.restore(sess, "/tmp/model.ckpt")

Отже, чому є 3 файли?


2
Ви придумали, як вирішити це? Як я можу знову завантажити модель (за допомогою Keras)?
rajkiran

Відповіді:


116

Спробуйте це:

with tf.Session() as sess:
    saver = tf.train.import_meta_graph('/tmp/model.ckpt.meta')
    saver.restore(sess, "/tmp/model.ckpt")

Метод збереження TensorFlow зберігає три види файлів, оскільки він зберігає структуру графа окремо від змінних значень . .metaФайл описує збережену структуру графа, так що вам потрібно імпортувати його перед відновленням контрольної точки ( в іншому випадку він не знає , які змінні записані часові контрольних точок відповідають).

Можна також зробити це:

# Recreate the EXACT SAME variables
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")

...

# Now load the checkpoint variable values
with tf.Session() as sess:
    saver = tf.train.Saver()
    saver.restore(sess, "/tmp/model.ckpt")

Незважаючи на те, що файлу не названо model.ckpt, ви все одно посилаєтесь на збережену контрольну точку під цим іменем під час відновлення. З saver.pyвихідного коду :

Користувачам потрібно взаємодіяти лише із вказаним користувачем префіксом… замість будь-якої фізичної назви шляху.


1
значить .index та .data не використовуються? Коли ж використовуються ці 2 файли?
ajfbiw.s

26
@ ajfbiw.s .meta зберігає структуру графа, .data зберігає значення кожної змінної у графі, .index ідентифікує контрольний список. Так у прикладі вище: import_meta_graph використовує .meta, а saver.restore використовує .data та .index
TK Bartel

О Я бачу. Дякую.
ajfbiw.s

1
Будь-який шанс зберегти модель з іншою версією TensorFlow, ніж ви використовуєте для завантаження? ( github.com/tensorflow/tensorflow/isissue/5639 )
TK Bartel

5
Хтось знає, що це 00000і 00001цифри означають? у variables.data-?????-of-?????файлі
Іван Талалаєв

55
  • метафайл : описує збережену структуру графа, включає в себе GraphDef, SaverDef, і так далі; потім застосувати tf.train.import_meta_graph('/tmp/model.ckpt.meta'), відновить Saverі Graph.

  • індексний файл : це незмінна таблиця рядків-рядків (tensorflow :: table :: Table). Кожен ключ - це ім'я тензора, його значення - серіалізований BundleEntryProto. Кожен BundleEntryProto описує метадані тензора: який із файлів "даних" містить вміст тензора, зміщення у цей файл, контрольну суму, деякі допоміжні дані тощо.

  • файл даних : це колекція TensorBundle, збережіть значення всіх змінних.


У мене є файл pb, який я маю для класифікації зображень. Чи можу я використовувати його для класифікації відео в режимі реального часу?

Чи можете ви, будь ласка, повідомте мене, використовуючи Keras 2, як я завантажую модель, якщо вона збережена як 3 файли?
rajkiran

5

Я відновлюю вкладені вкладені слова з підручника Word2Vec tensorflow.

У випадку, якщо ви створили кілька пунктів пропуску:

наприклад, створені файли виглядають приблизно так

model.ckpt-55695.data-00000-of-00001

model.ckpt-55695.index

model.ckpt-55695.meta

спробуйте це

def restore_session(self, session):
   saver = tf.train.import_meta_graph('./tmp/model.ckpt-55695.meta')
   saver.restore(session, './tmp/model.ckpt-55695')

при виклику Resto_session ():

def test_word2vec():
   opts = Options()    
   with tf.Graph().as_default(), tf.Session() as session:
       with tf.device("/cpu:0"):            
           model = Word2Vec(opts, session)
           model.restore_session(session)
           model.get_embedding("assistance")

Що означає "00000-of-00001" у "model.ckpt-55695.data-00000-of-00001"?
hafiz031

0

Якщо, наприклад, ви тренували CNN з випадом, ви можете це зробити:

def predict(image, model_name):
    """
    image -> single image, (width, height, channels)
    model_name -> model file that was saved without any extensions
    """
    with tf.Session() as sess:
        saver = tf.train.import_meta_graph('./' + model_name + '.meta')
        saver.restore(sess, './' + model_name)
        # Substitute 'logits' with your model
        prediction = tf.argmax(logits, 1)
        # 'x' is what you defined it to be. In my case it is a batch of RGB images, that's why I add the extra dimension
        return prediction.eval(feed_dict={x: image[np.newaxis,:,:,:], keep_prob_dnn: 1.0})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.