0

Dies ist der Fehler, den ich bekamtensorflow: Valueerror: GraphDef kann nicht größer sein als 2 GB

Traceback (most recent call last): 
    File "fully_connected_feed.py", line 387, in <module> 
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) 
    File "/home/-/.local/lib/python2.7/site- 
packages/tensorflow/python/platform/app.py", line 44, in run 
    _sys.exit(main(_sys.argv[:1] + flags_passthrough)) 
    File "fully_connected_feed.py", line 289, in main 
    run_training() 
    File "fully_connected_feed.py", line 256, in run_training 
    saver.save(sess, checkpoint_file, global_step=step) 
    File "/home/-/.local/lib/python2.7/site- 
packages/tensorflow/python/training/saver.py", line 1386, in save 
    self.export_meta_graph(meta_graph_filename) 
    File "/home/-/.local/lib/python2.7/site- 
packages/tensorflow/python/training/saver.py", line 1414, in export_meta_graph 
    graph_def=ops.get_default_graph().as_graph_def(add_shapes=True), 
    File "/home/-/.local/lib/python2.7/site- 
packages/tensorflow/python/framework/ops.py", line 2257, in as_graph_def 
    result, _ = self._as_graph_def(from_version, add_shapes) 
    File "/home/-/.local/lib/python2.7/site- 
packages/tensorflow/python/framework/ops.py", line 2220, in _as_graph_def 
    raise ValueError("GraphDef cannot be larger than 2GB.") 
ValueError: GraphDef cannot be larger than 2GB. 

Ich glaube, es aus dem Ergebnis dieses Codes ist

weights = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hidden1")[0] 
weights = tf.scatter_nd_update(weights,indices, updates) 
weights = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hidden2")[0] 
weights = tf.scatter_nd_update(weights,indices, updates) 

Ich bin nicht sicher, warum mein Modell wird so groß (15k Schritte und 240MB). Irgendwelche Gedanken? Vielen Dank!

Antwort

1

Es ist schwer zu sagen, was passiert, ohne den Code zu sehen, aber TensorFlow-Modellgrößen werden im Allgemeinen nicht mit der Anzahl der Schritte zunehmen - sie sollten behoben werden.

Wenn die Modellgröße mit der Anzahl der Schritte zunimmt, wird vorgeschlagen, dass der Berechnungsgraph in jedem Schritt hinzugefügt wird. Zum Beispiel so etwas wie:

import tensorflow as tf 

with tf.Session() as sess: 
    for i in xrange(1000): 
    sess.run(tf.add(1, 2)) 
    # or perhaps sess.run(tf.scatter_nd_update(...)) in your case 

schaffen werden 3000 Knoten in dem Graphen (einer für Add, einen für '1' eine für '2' bei jeder Iteration). Stattdessen möchten Sie Ihre Berechnungsgraphen einmal definieren und immer wieder mit so etwas wie laufen:

import tensorflow as tf 

x = tf.add(1, 2) 
# or perhaps x = tf.scatter_nd_update(...) in your case 
with tf.Session() as sess: 
    for i in xrange(1000): 
    sess.run(x) 

, die eine feste Graph von 3 Knoten für alle 1000 (und mehr) Iterationen haben. Ich hoffe, das hilft.

+0

Danke! Ich bekomme Ihren Punkt auf dem Modell zu erhöhen, aber ich verschachtelte 'tf.scatter_nd_update (...)', weil ich meine Gewichte bei jedem Schritt aktualisieren musste (eine Art manuelle Faltung). Vielleicht ist es der falsche Weg? –

+0

Vielleicht verstehe ich das falsch, aber trifft das nicht zu? Rufen Sie nicht 'tf.scatter_nd_update' in der Schleife auf, sondern speichern Sie die zurückgegebene Operation und rufen Sie sie in der Schleife auf. Aus der [Dokumentation von 'tf.scatter_nd_update'] (https://www.tensorflow.org/api_docs/python/tf/scatter_nd_update) - wendet es das Update an und gibt einfach den gleichen Wert wie das erste Argument zurück. So könnten Sie etwas tun wie: update = tf.scatter_nd_update (Gewichte, Indizes, Updates) für i in xrange (num_steps): sess.run (Update) – ash

Verwandte Themen