spicy burrito spicy burrito - 1 year ago 116
Python Question

TensorFlow tensor not reshaping properly

I have created a script that mirrors the one described in TensorFlow's Deep MNIST for Experts tutorial found here.

However my script returns an error quite early on when it tries to reshape the x tensor from the dimensions

[-1,28,28,1]
into the dimensions
[-1,28,28,1]
. I am confused as the tutorial does the same thing with success however it throws the following error for me:

ValueError: Cannot feed value of shape (100, 784) for Tensor 'Reshape:0', which has shape '(?, 28, 28, 1)'


My python script in full is here below:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf


x = tf.placeholder(dtype = tf.float32, shape = [None,784])
y_ = tf.placeholder(dtype = tf.float32, shape = [None, 10])


W1 = tf.Variable(tf.random_normal([5,5,1,32]))
b1 = tf.Variable(tf.random_normal([32]))


This is where I suspect the error occurs:

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

output1 = tf.add(tf.nn.conv2d(x,W1, strides =[1,1,1,1], padding = "SAME"), b1)
output1 = tf.nn.relu(output1)
output1 = tf.nn.max_pool(output1, ksize = [1,2,2,1], strides = [1,2,2,1], padding = "SAME")


W2 = tf.Variable(tf.random_normal([5,5,32,64]))
b2 = tf.Variable(tf.random_normal([64]))


output2 = tf.add(tf.nn.conv2d(output1,W2, strides = [1,1,1,1], padding = "SAME"), b2)
output2 = tf.nn.relu(output2)
output2 = tf.nn.max_pool(output2, ksize = [1,2,2,1], strides = [1,2,2,1], padding = "SAME")
output2 = tf.reshape(output2, [-1, 7*7*64])



W_fc = tf.Variable(tf.random_normal([7*7*64,1024]))
b_fc = tf.Variable(tf.random_normal([1024]))


output3 = tf.add(tf.matmul(output2,W_fc), b_fc )
output3 = tf.nn.relu(output3)
output3 = tf.nn.dropout(output3, keep_prob = 0.85)


W_final = tf.Variable(tf.random_normal([1024,10]))
b_final = tf.Variable(tf.random_normal([10]))


predictions = tf.add(tf.matmul(output3,W_final), b_final)


cost = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels = y_ ,logits = predictions))
optimiser = tf.train.AdamOptimizer(1e-4).minimize(cost)


sess = tf.InteractiveSession()
tf.global_variables_initializer().run()



for i in range(7000):
batchx_s,batchy_s = mnist.train.next_batch(100)
sess.run(optimiser, feed_dict = {x:batchx_s, y_:batchy_s})


with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(20000):
batch = mnist.train.next_batch(50)
optimiser.run(feed_dict={x: batch[0], y_: batch[1]})


correct_prediction = tf.equal(tf.argmax(predictions, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


.

print(sess.run(accuracy, feed_dict={x: mnist.test.images,y_: mnist.test.labels}))

Answer Source

I have fixed your code and it should work properly.

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf


x = tf.placeholder(dtype = tf.float32, shape = [None,784])
y_ = tf.placeholder(dtype = tf.float32, shape = [None, 10])


W1 = tf.Variable(tf.random_normal([5,5,1,32]))
b1 = tf.Variable(tf.random_normal([32]))

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

output1 = tf.add(tf.nn.conv2d(x_image,W1, strides =[1,1,1,1], padding = "SAME"), b1)
output1 = tf.nn.relu(output1)
output1 = tf.nn.max_pool(output1, ksize = [1,2,2,1], strides = [1,2,2,1], padding = "SAME")


W2 = tf.Variable(tf.random_normal([5,5,32,64]))
b2 = tf.Variable(tf.random_normal([64]))


output2 = tf.add(tf.nn.conv2d(output1,W2, strides = [1,1,1,1], padding = "SAME"), b2)
output2 = tf.nn.relu(output2)
output2 = tf.nn.max_pool(output2, ksize = [1,2,2,1], strides = [1,2,2,1], padding = "SAME")
output2 = tf.reshape(output2, [-1, 7*7*64])



W_fc = tf.Variable(tf.random_normal([7*7*64,1024]))
b_fc = tf.Variable(tf.random_normal([1024]))

output3 = tf.add(tf.matmul(output2,W_fc), b_fc )
output3 = tf.nn.relu(output3)
output3 = tf.nn.dropout(output3, keep_prob = 0.85)


W_final = tf.Variable(tf.random_normal([1024,10]))
b_final = tf.Variable(tf.random_normal([10]))


predictions = tf.add(tf.matmul(output3,W_final), b_final)


cost = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels = y_  ,logits = predictions))
optimiser = tf.train.AdamOptimizer(1e-4).minimize(cost)
correct_prediction = tf.equal(tf.argmax(predictions, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))



with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20000):
        batch = mnist.train.next_batch(50)
        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1]})
            print('step %d, training accuracy %g' % (i, train_accuracy))
        optimiser.run(feed_dict={x: batch[0], y_: batch[1]})
    print('test accuracy %g' % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels,}))

Your main issue was the line -

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

output1 = tf.add(tf.nn.conv2d(x,W1, strides =[1,1,1,1], padding = "SAME"), b1)

The objective of a placeholder is only to feed data to a target tensor; it should'nt be treated like a normal tensor. I have also removed the redundant calls to variable initializer and running optimizer -

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()


for i in range(7000):
    batchx_s,batchy_s = mnist.train.next_batch(100)
    sess.run(optimiser, feed_dict = {x:batchx_s, y_:batchy_s})

The above looks as though they come from some place else :) Finally, I've added some print statements adapted from said tutorial, its always good to know how your training is performing real-time

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download