web-dev-qa-db-fra.com

Tensorflow: impossible d'interpréter la clé feed_dict comme tenseur

J'essaie de construire un modèle de réseau neuronal avec une couche cachée (1024 nœuds). La couche cachée n'est rien d'autre qu'une unité relu. Je traite également les données d'entrée par lots de 128.

Les entrées sont des images de taille 28 * 28. Dans le code suivant, j'obtiens l'erreur en ligne

_, c = sess.run([optimizer, loss], feed_dict={x: batch_x, y: batch_y})
Error: TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder_64:0", shape=(128, 784), dtype=float32) is not an element of this graph.

Voici le code que j'ai écrit

#Initialize

batch_size = 128

layer1_input = 28 * 28
hidden_layer1 = 1024
num_labels = 10
num_steps = 3001

#Create neural network model
def create_model(inp, w, b):
    layer1 = tf.add(tf.matmul(inp, w['w1']), b['b1'])
    layer1 = tf.nn.relu(layer1)
    layer2 = tf.matmul(layer1, w['w2']) + b['b2']
    return layer2

#Initialize variables
x = tf.placeholder(tf.float32, shape=(batch_size, layer1_input))
y = tf.placeholder(tf.float32, shape=(batch_size, num_labels))

w = {
'w1': tf.Variable(tf.random_normal([layer1_input, hidden_layer1])),
'w2': tf.Variable(tf.random_normal([hidden_layer1, num_labels]))
}
b = {
'b1': tf.Variable(tf.zeros([hidden_layer1])),
'b2': tf.Variable(tf.zeros([num_labels]))
}

init = tf.initialize_all_variables()
train_prediction = tf.nn.softmax(model)

tf_valid_dataset = tf.constant(valid_dataset)
tf_test_dataset = tf.constant(test_dataset)

model = create_model(x, w, b)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(model, y))    
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

#Process
with tf.Session(graph=graph1) as sess:
    tf.initialize_all_variables().run()
    total_batch = int(train_dataset.shape[0] / batch_size)

    for Epoch in range(num_steps):    
        loss = 0
        for i in range(total_batch):
            batch_x, batch_y = train_dataset[Epoch * batch_size:(Epoch+1) * batch_size, :], train_labels[Epoch * batch_size:(Epoch+1) * batch_size,:]

            _, c = sess.run([optimizer, loss], feed_dict={x: batch_x, y: batch_y})
            loss = loss + c
        loss = loss / total_batch
        if Epoch % 500 == 0:
            print ("Epoch :", Epoch, ". cost = {:.9f}".format(avg_cost))
            print("Minibatch accuracy: %.1f%%" % accuracy(predictions, batch_labels))
            valid_prediction = tf.run(tf_valid_dataset, {x: tf_valid_dataset})
            print("Validation accuracy: %.1f%%" % accuracy(valid_prediction.eval(), valid_labels))
    test_prediction = tf.run(tf_test_dataset,  {x: tf_test_dataset})
    print("TEST accuracy: %.1f%%" % accuracy(test_prediction.eval(), test_labels))
17
Pratyush

La variable x n'est pas dans le même graphique que modèle, essayez de définir tous ces éléments dans la même étendue de graphique. Par exemple,

# define a graph
graph1 = tf.Graph()
with graph1.as_default():
    # placeholder
    x = tf.placeholder(...)
    y = tf.placeholder(...)
    # create model
    model = create(x, w, b)

with tf.Session(graph=graph1) as sess:
# initialize all the variables
sess.run(init)
# then feed_dict
# ......
10
daoliker

Cela a fonctionné pour moi

from keras import backend as K

et après avoir prédit mes données, j'ai inséré cette partie de code, puis j'ai à nouveau chargé le modèle.

K.clear_session()

j'ai fait face à ce problème dans le serveur de production, mais dans mon PC, il fonctionnait bien

...........

from keras import backend as K

#Before prediction
K.clear_session()

#After prediction
K.clear_session()
50
yunus

Si vous utilisez Django server, lancez simplement server avec --nothreading par exemple:

python manage.py runserver --nothreading  
14
Javad Peymanfard

Le message d'erreur TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("...", dtype=dtype) is not an element of this graph peut également apparaître si vous exécutez une session en dehors de la portée de son instruction with. Considérer:

with tf.Session() as sess:
    sess.run(logits, feed_dict=feed_dict) 

sess.run(logits, feed_dict=feed_dict)

Si logits et feed_dict Sont définis correctement, la première commande sess.run S'exécutera normalement, mais la seconde déclenchera l'erreur mentionnée.

2
dopexxx

Dans mon cas, j'utilisais la boucle tout en appelant CNN plusieurs fois, j'ai résolu mon problème en procédant comme suit:

# Declare this as global:

global graph

graph = tf.get_default_graph()

# Then just before you call in your model, use this

with graph.as_default():

# call you models here

Remarque: Dans mon cas également, l'application a bien fonctionné pour la première fois, puis a donné l'erreur ci-dessus. L'utilisation du correctif ci-dessus a résolu le problème.

J'espère que ça t'as aidé.

2
Ashar Siddiqui