2016-04-26 7 views
0

Я использую тензорный поток для запуска нейронной сети свертки в базе данных MNIST. Но я получаю следующую ошибку.Ошибка отсутствия заполнителя в потоке тензора для CNN

tensorflow.python.framework.errors.InvalidArgumentError: Вы должны кормить значение для тензора заполнителем 'х' с DTYPE флоат [[Node: х = Placeholderdtype = DT_FLOAT, форма = [], _device = "/ работа : локальный/реплика: 0/задача: 0/CPU: 0" ]]

х = tf.placeholder (tf.float32, [Отсутствует, 784], имя = 'х') # mnist данные изображения форма 28 * 28 = 784

Я думал, что правильно обновляю значение x с помощью feed_dict, но его высказывание я не обновляю значение placeholder x.

Кроме того, есть ли в моем коде какой-либо другой логический недостаток?

Любая помощь была бы принята с благодарностью. Благодарю.

import tensorflow as tf 
import numpy 
from tensorflow.examples.tutorials.mnist import input_data 

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
         strides=[1, 2, 2, 1], padding='SAME') 

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 


mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) 

# Parameters 
learning_rate = 0.01 
training_epochs = 10 
batch_size = 100 
display_step = 1 

# tf Graph Input 
#x = tf.placeholder(tf.float32, [50, 784], name='x') # mnist data image of shape 28*28=784 
#y = tf.placeholder(tf.float32, [50, 10], name='y') # 0-9 digits recognition => 10 classes 

# Set model weights 
W = tf.Variable(tf.zeros([784, 10]), name="weights") 
b = tf.Variable(tf.zeros([10]), name="bias") 

W_conv1 = weight_variable([5, 5, 1, 32]) 
b_conv1 = bias_variable([32]) 


W_conv2 = weight_variable([5, 5, 32, 64]) 
b_conv2 = bias_variable([64]) 


W_fc1 = weight_variable([7 * 7 * 64, 1024]) 
b_fc1 = bias_variable([1024]) 

W_fc2 = weight_variable([1024, 10]) 
b_fc2 = bias_variable([10]) 

# Initializing the variables 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 


    # Training cycle 
    for i in range(1000): 
     print i 
     batch_xs, batch_ys = mnist.train.next_batch(50) 

     x_image = tf.reshape(x, [-1,28,28,1]) 

     h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
     h_pool1 = max_pool_2x2(h_conv1) 

     h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
     h_pool2 = max_pool_2x2(h_conv2) 

     h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) 
     h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 


     y_conv=tf.nn.softmax(tf.matmul(h_fc1, W_fc2) + b_fc2) 

     cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(y_conv), reduction_indices=[1])) 
     sess.run(
      [cross_entropy, y_conv], 
      feed_dict={x: batch_xs, y: batch_ys}) 

     correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y,1)) 
     print correct_prediction.eval() 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
+0

Почему вы прокомментировали заполнители? #x = tf.placeholder (tf.float32, [50, 784], name = 'x') #y = tf.placeholder (tf.float32, [50, 10], name = 'y') В какой строке вы получили сообщение об ошибке? –

ответ

1

Почему вы пытаетесь создать переменные-заполнители? Вы должны иметь возможность использовать выходы, созданные mnist.train.next_batch (50), непосредственно при условии, что вы перемещаете вычисление правильного_предсказывания и точности внутри самой модели.

batch_xs, batch_ys = mnist.train.next_batch(50) x_image = tf.reshape(batch_xs, [-1,28,28,1]) ... cross_entropy = tf.reduce_mean(-tf.reduce_sum(batch_ys * tf.log(y_conv), reduction_indices=[1])) correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(batch_ys,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) predictions_correct, acc = sess.run([cross_entropy, y_conv, correct_prediction, accuracy]) print predictions_correct, acc

2

Вы получили эту ошибку, потому что вы пытаетесь запустить eval() на correct_prediction. Для того, чтобы оценить этот тензор, требуется пакетный ввод (x и y). Вы можете исправить ошибку, изменив его:

print correct_prediction.eval(feed_dict={x: batch_xs, y: batch_ys}) 

Но, как упоминалось Benoit Steiner, вы могли бы так же легко вытащить его в модель.

В более общем случае вы не делаете никакой оптимизации здесь, но, возможно, вы еще не дошли до этого. Пока он стоит, он просто печатает неудачные прогнозы на некоторое время. :)

0

Во-первых, ваши x и y закомментированы, если это присутствует в вашем фактическом коде, это, скорее всего, проблема.

correct_prediction.eval() эквивалентен tf.session.run(correct_prediction) (или в вашем случае sess.run()) и, следовательно, для него требуется такой же синтаксис *. Поэтому для запуска нужно быть correct_prediction.eval(feed_dict={x: batch_xs, y: batch_ys}), однако следует предупредить, что это, как правило, интенсивный объем памяти и может привести к зависанию системы. Вытягивание функции точности в модель может быть хорошей идеей из-за использования плунжера.

Я не видел функцию оптимизации, чтобы использовать вашу кросс-энтропию, однако я никогда не пытался ее не использовать, поэтому, если она работает, не исправляйте ее.но если она заканчивается метания ошибку вы можете попробовать:

optimizer = optimizer = tf.train.AdamOptimizer().minimize(cross_entropy) 

и заменить 'cross_entropy' в

sess.run([cross_entropy, y_conv],feed_dict={x: batch_xs, y: batch_ys}) 

с 'optimizer'

https://pythonprogramming.net/tensorflow-neural-network-session-machine-learning-tutorial/

проверки на раздел оценки точности сценария.