Tensorflow: не может интерпретировать ключ feed_dict как тензор
Я пытаюсь создать модель нейронной сети с одним скрытым слоем (1024 узла). Скрытый слой - не что иное, как единица relu. Я также обрабатываю входные данные партиями 128.
Входы представляют собой изображения размером 28 * 28. В следующем коде я получаю ошибку в строке
_, 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.
Вот код, который я написал
#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))
Ответы
Ответ 1
Переменная x не находится в том же графе, что и модель, попробуйте определить все из них в той же области графика. Например,
# 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
# ......
Ответ 2
Это сработало для меня
from keras import backend as K
и после прогнозирования моих данных я вставил эту часть кода, а затем снова загрузил модель.
K.clear_session()
я столкнулся с этой проблемой на производственном сервере, но на моем компьютере он работал нормально
...........
from keras import backend as K
#Before prediction
K.clear_session()
#After prediction
K.clear_session()
Ответ 3
Если вы используете сервер django, просто запускайте сервер с --nothreading
например:
python manage.py runserver --nothreading
Ответ 4
В моем случае я использовал цикл при вызове в CNN несколько раз, и я исправил свою проблему, выполнив следующее:
# 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
Примечание. В моем случае приложение впервые работало нормально, а затем показало ошибку выше. Использование вышеуказанного исправления решило проблему.
Надеюсь, это поможет.
Ответ 5
Сообщение об ошибке TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("...", dtype=dtype) is not an element of this graph
может также возникнуть в случае запуска сеанса вне сферы его with
утверждением. Рассматривать:
with tf.Session() as sess:
sess.run(logits, feed_dict=feed_dict)
sess.run(logits, feed_dict=feed_dict)
Если logits
и feed_dict
определены правильно, первая команда sess.run
будет выполняться нормально, а вторая вызовет указанную ошибку.