2
definiert

Mein tensorflow Modell ist wie folgt definiert:Wie ein tensorflow Modell (Weglassen des Etiketten-Tensor) zu speichern, ohne Variablen

X = tf.placeholder(tf.float32, [None,training_set.shape[1]],name = 'X') 
Y = tf.placeholder(tf.float32,[None,training_labels.shape[1]], name = 'Y') 
A1 = tf.contrib.layers.fully_connected(X, num_outputs = 50, activation_fn = tf.nn.relu) 
A1 = tf.nn.dropout(A1, 0.8) 
A2 = tf.contrib.layers.fully_connected(A1, num_outputs = 2, activation_fn = None) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = A2, labels = Y))  
global_step = tf.Variable(0, trainable=False) 
start_learning_rate = 0.001 
learning_rate = tf.train.exponential_decay(start_learning_rate, global_step, 200, 0.1, True) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

Jetzt möchte ich Y dieses Modell Weglassen Tensor speichern (Y ist das Label Tensor zum Training ist X der tatsächliche Eingang). Auch wenn ich den Ausgangsknoten bei der Verwendung von freeze_graph.py erwähne, sollte ich "A2" erwähnen oder ist es mit einem anderen Namen gespeichert?

Antwort

3

Obwohl Sie die Variablen nicht manuell definiert haben, enthält das obige Code-Snippet tatsächlich 15 speicherbare Variablen. Sie können sie mit dieser internen tensorflow Funktion siehe:

from tensorflow.python.ops.variables import _all_saveable_objects 
for obj in _all_saveable_objects(): 
    print(obj) 

Für den Code oben, es erzeugt die folgende Liste:

<tf.Variable 'fully_connected/weights:0' shape=(100, 50) dtype=float32_ref> 
<tf.Variable 'fully_connected/biases:0' shape=(50,) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/weights:0' shape=(50, 2) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/biases:0' shape=(2,) dtype=float32_ref> 
<tf.Variable 'Variable:0' shape=() dtype=int32_ref> 
<tf.Variable 'beta1_power:0' shape=() dtype=float32_ref> 
<tf.Variable 'beta2_power:0' shape=() dtype=float32_ref> 
<tf.Variable 'fully_connected/weights/Adam:0' shape=(100, 50) dtype=float32_ref> 
<tf.Variable 'fully_connected/weights/Adam_1:0' shape=(100, 50) dtype=float32_ref> 
<tf.Variable 'fully_connected/biases/Adam:0' shape=(50,) dtype=float32_ref> 
<tf.Variable 'fully_connected/biases/Adam_1:0' shape=(50,) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/weights/Adam:0' shape=(50, 2) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/weights/Adam_1:0' shape=(50, 2) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/biases/Adam:0' shape=(2,) dtype=float32_ref> 
<tf.Variable 'fully_connected_1/biases/Adam_1:0' shape=(2,) dtype=float32_ref> 

Es gibt Variablen aus beiden fully_connected Schichten und einige mehr kommen von Adam Optimierer (siehe this question). Beachten Sie, dass in dieser Liste keine Platzhalter für X und Y vorhanden sind. Sie müssen daher nicht ausgeschlossen werden. Natürlich existieren diese Tensoren im Meta-Diagramm, aber sie haben keinen Wert und sind daher nicht speicherbar.

Die _all_saveable_objects() Liste ist, was Tensorflow Saver standardmäßig speichert, wenn die Variablen nicht explizit angegeben werden. Daher einfach die Antwort auf Ihre wichtigste Frage ist:

saver = tf.train.Saver() # all saveable objects! 
with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    saver.save(sess, "...") 

Es gibt keine Möglichkeit, den Namen für die tf.contrib.layers.fully_connected Funktion zur Verfügung zu stellen (als Ergebnis, wird es gespeichert als fully_connected_1/...), aber du bist zu tf.layers.dense wechseln ermutigt, was hat ein name Argument. Um zu sehen, warum es sowieso eine gute Idee ist, werfen Sie einen Blick auf this und this discussion.

+0

Danke für die Antwort @Maxim. Wirklich schätzen Sie Ihre Zeit. –

Verwandte Themen