2017-07-05 2 views
4

Ich bin ziemlich neu in Tensorflow und experimentiere derzeit mit Modellen unterschiedlicher Komplexität. Ich habe ein Problem mit der Speicher- und Wiederherstellungsfunktion des Pakets. Soweit ich die Tutorials verstanden habe, sollte ich in der Lage sein, einen trainierten Graphen wiederherzustellen und ihn später mit einigen neuen Eingaben auszuführen. Allerdings habe ich die folgende Fehlermeldung erhalten, wenn ich versuche nur, dass .:Wiederherstellen eines Modells mit variabler Eingangslänge in Tensorflow Ergebnisse in InvalidArgumentError

InvalidArgumentError (siehe oben für Traceback) zu tun: Shape [-1,10] hat negative Dimensionen [[Knoten: Platzhalter = Placeholderdtype = DT_FLOAT , Form = [?, 10], _device = "/ Job: localhost/Replik: 0/Aufgabe: 0/cpu: 0"]]

Mein Verständnis der Nachricht, dass die restaurierte graph nicht mag eine Dimension, die willkürlich bleibt, was wiederum für praktische Fälle notwendig ist, in denen ich nicht vorher weiß, wie groß meine Eingabe sein wird. Ein Codeschnipsel als minimales Beispiel, das den obigen Fehler hervorbringt, finden Sie weiter unten. Ich weiß, wie man jeden Tensor einzeln wiederherstellt, aber das wird ziemlich schnell unpraktisch, wenn die Komplexität der Modelle zunimmt. Ich bin dankbar für jede Hilfe, die ich bekomme und entschuldige mich, falls meine Frage dumm ist.

import numpy as np 
import tensorflow as tf 

def generate_random_input(): 
    alist = [] 
    for _ in range(10): 
     alist.append(np.random.uniform(-1, 1, 100)) 
    return np.array(alist).T 
def generate_random_target(): 
    return np.random.uniform(-1, 1, 100) 

x = tf.placeholder('float', [None, 10]) 
y = tf.placeholder('float') 

# the model 
w1 = tf.get_variable('w1', [10, 1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 
b1 = tf.get_variable('b1', [1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 

result = tf.add(tf.matmul(x, w1), b1, name='result') 

loss = tf.reduce_mean(tf.losses.mean_squared_error(predictions=result, labels=y)) 
optimizer = tf.train.AdamOptimizer(0.03).minimize(loss) 
saver = tf.train.Saver() 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    sess.run([optimizer, loss], feed_dict={x: generate_random_input(), y: generate_random_target()}) 
    saver.save(sess, 'file_name') 

# now load the model in another session: 
sess2 = tf.Session() 
saver = tf.train.import_meta_graph('file_name.meta') 
saver.restore(sess2, tf.train.latest_checkpoint('./')) 
graph = tf.get_default_graph() 
pred = graph.get_operation_by_name('result') 
test_result = sess2.run(pred, feed_dict={x: generate_random_input()}) 
+0

kann es ein Problem von Tensorflow sein. Versuchen Sie, die Sparemethode zu überprüfen, oder entfernen Sie einfach den Sparer. Probieren Sie es aus. – jowett

Antwort

0

In der letzten Zeile, feed_dict die label_palceholder mit den Daten nicht. Im Platzhalter ist die Dimension [-1] also -1, anders als die Stapelgröße. Das ist die Ursache.

+0

Vielen Dank für Ihre Antwort. Leider habe ich es entweder nicht richtig verstanden oder es hilft nicht. Ich habe versucht, den Label-Platzhalter ebenfalls zu füttern, aber das führt zu demselben Fehler. Außerdem glaube ich nicht, dass es einen Unterschied machen sollte, da "Ergebnis" nur die Eingabe (x) und die wiederhergestellten Tensoren (w1, b1) als Argumente verwendet. –

0

Ich habe genau das gleiche Problem wie Sie. Ich importiere und teste eine Reihe verschiedener CNNs mit unterschiedlichen Schichtgrößen und teste verschiedene Datasets. Sie können wie so Ihre Modellerstellung in Funktion bleiben und es in Ihren anderen Code neu:

def create_model(): 
    x = tf.placeholder('float', [None, 10]) 
    y = tf.placeholder('float') 
    w1 = tf.get_variable('w1', [10, 1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 
    b1 = tf.get_variable('b1', [1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 
    result = tf.add(tf.matmul(x, w1), b1, name='result') 
    return x, y, result 

x, y, result = create_model() 
loss = tf.reduce_mean(tf.losses.mean_squared_error(predictions=result, labels=y)) 
optimizer = tf.train.AdamOptimizer(0.03).minimize(loss) 
saver = tf.train.Saver() 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    sess.run([optimizer, loss], feed_dict={x: generate_random_input(), y: generate_random_target()}) 
    saver.save(sess, 'file_name') 

# now load the model in another session: 
sess2 = tf.Session() 
# This stuff is optional if everything is the same scope 
x, y, result = create_model() 
saver = tf.train.Saver() 
# loss = ... if you want loss 
# Now just restore the weights and run 
saver.restore(sess, 'file_name') 
test_result = sess2.run(pred, feed_dict={x: generate_random_input()}) 

Dies ist ein bisschen langweilig, wenn ich viele komplexe Architekturen mit unterschiedlichen Dimensionen importieren möchten. Für unsere Situation weiß ich nicht, ob es eine andere Möglichkeit gibt, ein ganzes Modell wiederherzustellen, als diese Architektur zuerst in der zweiten Sitzung neu zu erstellen.

Verwandte Themen