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))
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
# ......
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()
Si vous utilisez Django server, lancez simplement server avec --nothreading
par exemple:
python manage.py runserver --nothreading
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.
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é.