2016-01-24 24 views
15

Próbuję przywrócić model TensorFlow. Śledziłem ten przykład: http://nasdag.github.io/blog/2016/01/19/classifying-bees-with-google-tensorflow/Przywracanie modelu TensorFlow

Na końcu kodu w przykładzie I dodaje te linie:

saver = tf.train.Saver() 
save_path = saver.save(sess, "model.ckpt") 
print("Model saved in file: %s" % save_path) 

dwa pliki zostały utworzone: checkpoint i model.ckpt.

w nowym pliku python (tomas_bees_predict.py), mam ten kod:

import tensorflow as tf 

saver = tf.train.Saver() 

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

Jednak kiedy wykonać kod, otrzymuję ten błąd:

Traceback (most recent call last): 
    File "tomas_bees_predict.py", line 3, in <module> 
    saver = tf.train.Saver() 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 705, in __init__ 
raise ValueError("No variables to save") 

ValueError: Brak zmiennych zapisać

Czy istnieje sposób na odczyt pliku mode.ckpt i zobacz, jakie zmienne zostały zapisane? A może ktoś może pomóc w zapisaniu modelu i przywróceniu go na podstawie przykładu opisanego powyżej?

EDIT 1:

myślę Próbowałem uruchomiony ten sam kod, aby odtworzyć strukturę modelu i byłem coraz błąd. Myślę, że może to być związane z faktem, że kod opisany tutaj nie używa nazwanych zmiennych: http://nasdag.github.io/blog/2016/01/19/classifying-bees-with-google-tensorflow/

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

Więc zrobiłem ten eksperyment. Napisałem dwie wersje kodu (zi bez nazwanych zmiennych), aby zapisać model i kod, aby przywrócić model.

tensor_save_named_vars.py:

import tensorflow as tf 

# Create some variables. 
v1 = tf.Variable(1, name="v1") 
v2 = tf.Variable(2, name="v2") 

# Add an op to initialize the variables. 
init_op = tf.initialize_all_variables() 

# 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) 
    print "v1 = ", v1.eval() 
    print "v2 = ", v2.eval() 
    # Save the variables to disk. 
    save_path = saver.save(sess, "/tmp/model.ckpt") 
    print "Model saved in file: ", save_path 

tensor_save_not_named_vars.py:

import tensorflow as tf 

# Create some variables. 
v1 = tf.Variable(1) 
v2 = tf.Variable(2) 

# Add an op to initialize the variables. 
init_op = tf.initialize_all_variables() 

# 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) 
    print "v1 = ", v1.eval() 
    print "v2 = ", v2.eval() 
    # Save the variables to disk. 
    save_path = saver.save(sess, "/tmp/model.ckpt") 
    print "Model saved in file: ", save_path 

tensor_restore.py:

import tensorflow as tf 

# Create some variables. 
v1 = tf.Variable(0, name="v1") 
v2 = tf.Variable(0, name="v2") 

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

# Later, launch the model, use the saver to restore variables from disk, and 
# do some work with the model. 
with tf.Session() as sess: 
    # Restore variables from disk. 
    saver.restore(sess, "/tmp/model.ckpt") 
    print "Model restored." 
    print "v1 = ", v1.eval() 
    print "v2 = ", v2.eval() 

Oto co mam kiedy wykonać ten kod:

$ python tensor_save_named_vars.py 

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 4 
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 4 
v1 = 1 
v2 = 2 
Model saved in file: /tmp/model.ckpt 

$ python tensor_restore.py 

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 4 
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 4 
Model restored. 
v1 = 1 
v2 = 2 

$ python tensor_save_not_named_vars.py 

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 4 
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 4 
v1 = 1 
v2 = 2 
Model saved in file: /tmp/model.ckpt 

$ python tensor_restore.py 
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 4 
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 4 
W tensorflow/core/common_runtime/executor.cc:1076] 0x7ff953881e40 Compute status: Not found: Tensor name "v2" not found in checkpoint files /tmp/model.ckpt 
    [[Node: save/restore_slice_1 = RestoreSlice[dt=DT_INT32, preferred_shard=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](_recv_save/Const_0, save/restore_slice_1/tensor_name, save/restore_slice_1/shape_and_slice)]] 
W tensorflow/core/common_runtime/executor.cc:1076] 0x7ff953881e40 Compute status: Not found: Tensor name "v1" not found in checkpoint files /tmp/model.ckpt 
    [[Node: save/restore_slice = RestoreSlice[dt=DT_INT32, preferred_shard=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](_recv_save/Const_0, save/restore_slice/tensor_name, save/restore_slice/shape_and_slice)]] 
Traceback (most recent call last): 
    File "tensor_restore.py", line 14, in <module> 
    saver.restore(sess, "/tmp/model.ckpt") 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 891, in restore 
    sess.run([self._restore_op_name], {self._filename_tensor_name: save_path}) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 368, in run 
    results = self._do_run(target_list, unique_fetch_targets, feed_dict_string) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 444, in _do_run 
    e.code) 
tensorflow.python.framework.errors.NotFoundError: Tensor name "v2" not found in checkpoint files /tmp/model.ckpt 
    [[Node: save/restore_slice_1 = RestoreSlice[dt=DT_INT32, preferred_shard=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](_recv_save/Const_0, save/restore_slice_1/tensor_name, save/restore_slice_1/shape_and_slice)]] 
Caused by op u'save/restore_slice_1', defined at: 
    File "tensor_restore.py", line 8, in <module> 
    saver = tf.train.Saver() 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 713, in __init__ 
    restore_sequentially=restore_sequentially) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 432, in build 
    filename_tensor, vars_to_save, restore_sequentially, reshape) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 191, in _AddRestoreOps 
    values = self.restore_op(filename_tensor, vs, preferred_shard) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 106, in restore_op 
    preferred_shard=preferred_shard) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/io_ops.py", line 189, in _restore_slice 
    preferred_shard, name=name) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_io_ops.py", line 271, in _restore_slice 
    preferred_shard=preferred_shard, name=name) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 664, in apply_op 
    op_def=op_def) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1834, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1043, in __init__ 
    self._traceback = _extract_stack() 

Więc może oryginalny kod (patrz external link powyżej) może być modyfikowany na coś takiego:

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    weight_var = tf.Variable(initial, name="weight_var") 
    return weight_var 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    bias_var = tf.Variable(initial, name="bias_var") 
    return bias_var 

Ale wtedy pytanie Mam: przywraca zmienne weight_var i bias_var wystarczające do wdrożenia prognozy? Zrobiłem szkolenie na potężnej maszynie z GPU i chciałbym skopiować model do mniej wydajnego komputera bez GPU do uruchamiania prognoz.

+0

Możliwy duplikat [Tensorflow: Jak przywrócić wcześniej zapisany wzór (Python)] (http: // stackoverflow.com/questions/33759623/tensorflow-how-to-restore-a-previously-saved-model-python) – mrry

+0

Jest podobny, ale nie jest duplikatem. – Tomas

Odpowiedz

12

Istnieje podobne pytanie: Tensorflow: how to save/restore a model? TLDR; trzeba odtworzyć strukturę przy użyciu modelu samą sekwencję poleceń TensorFlow API przed użyciem obiektu Saver przywrócenie wagi

To nie jest optymalne, wykonaj Github issue #696 postępu na przeprowadzenie tej łatwiejsze

+1

Dla przypomnienia: Problem został zamknięty ponad rok temu i wygląda na to, że przechowywanie struktury modelu jest teraz obsługiwane. – bluenote10

+0

"musisz odtworzyć strukturę modelu za pomocą tej samej sekwencji poleceń interfejsu TensorFlow API, zanim użyjesz obiektu Saver do przywrócenia wagi" Czy możesz to wyjaśnić dalej? – Chaine

+3

@Chaine jest lepsza opcja, użyj MetaGraph lub zapisanego modelu –

1

upewnić deklarację tf.train. Tryb Saver() jest włączony z tf.Session() jako sesja

0

Ten problem powinien być spowodowany przez warianty zakresu nazwy podczas podwójnego tworzenia tej samej sieci.

umieścić polecenie:

tf.reset_default_graph()

przed utworzeniem sieci

Powiązane problemy