0

this question has been asked several times already, but I don't seem to be able to adapt previous solutions to my code. I would therefore appreciate any advice on how to solve this. I have tried using pdb and set a trace point right before the problem, which didn't give me much information. I am adapting this tutorial to my problem: https://www.oreilly.com/ideas/visualizing-convolutional-neural-networks

Data Shape:

x_train.shape: (1161, 68, 68, 1)
x_test.shape: (216, 68, 68, 1)
y_test.shape: (216,)
y_train.shape: (1161,)

Where the error occurs:

#Train the Model
steps = int(x_train.shape[0]/batchSize)
for i in range(numEpochs):
    print(i)
    accHist = []
    accHist2 = []
    #x_train, y_train = imf.shuffle(x_train, y_train)
    for j in range(steps):
        print(j)
        #Calculate our current step
        step = i * steps + j
        #Feed forward batch of train images into graph and log accuracy
        acc = sess.run([accuracy], feed_dict={X: x_train[(j*batchSize):((j+1)*batchSize),:,:,:], Y_: np.array(y_train[(j*batchSize):((j+1)*batchSize)]).reshape(1,30), keepRate1: 1, keepRate2: 1})
        print(accHist)
        accHist.append(acc)

        #Back propigate using adam optimizer to update weights and biases.
        sess.run(train_step, feed_dict={X: x_train[(j*batchSize):((j+1)*batchSize),:,:,:], Y_: np.array(y_train[(j*batchSize):((j+1)*batchSize)]).reshape(1,30), keepRate1: 0.2, keepRate2: 0.5})
        print("success")

    print('Epoch number {} Training Accuracy: {}'.format(i+1, np.mean(accHist)))

    #Feed forward all test images into graph and log accuracy
    for k in range(int(x_test.shape[0]/batchSize)):
        acc = sess.run(accuracy, feed_dict={X: x_test[(k*batchSize):((k+1)*batchSize),:,:,:], Y_: np.array(y_test[(k*batchSize):((k+1)*batchSize)]).reshape(1,30), keepRate1: 1, keepRate2: 1})
        accHist2.append(acc)
    print("Test Set Accuracy: {}".format(np.mean(accHist2)))

I am getting the following error message:

InvalidArgumentError: logits and labels must be same size: logits_size=[30,30] labels_size=[1,30]
     [[Node: cross_entropy_7/SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](cross_entropy_7/Reshape, cross_entropy_7/Reshape_1)]]

Following the tutorial, I thought the logins were set here:

#FULLY CONNECTED 3 & SOFTMAX OUTPUT
with tf.name_scope('softmax') as scope:
    fc2w = tf.Variable(tf.truncated_normal([512, classes], dtype=tf.float32,
                                           stddev=1e-1), name='weights3_2')
    fc2b = tf.Variable(tf.constant(1.0, shape=[classes], dtype=tf.float32),
                       trainable=True, name='biases3_2')
    Ylogits = tf.nn.bias_add(tf.matmul(fc1_drop, fc2w), fc2b)
    Y = tf.nn.softmax(Ylogits)

print(Ylogits.shape) here gives me: (?, 30). Classes is set at 30 so this seems to make sense.

This seems to be the functions that doesn't work, so I printed the shapes:

with tf.name_scope('cross_entropy'):
    print(Ylogits.shape)
    print(Y.shape)
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Ylogits, labels=Y_)
    loss = tf.reduce_mean(cross_entropy)

Which gave me:

(?, 30)
(?, 30)

When executing the line for back propagation above though this does not seem to work. Can anyone help?


In response to comment (this basically is the tutorial code from the link mentioned above):

Place Holders:

    classes = 30
    X = tf.placeholder(tf.float32, name="X-placeholder", shape=(None, 68, 68, 1))
    Y_ = tf.placeholder(tf.float32, [None, classes], name="Y_-placeholder")
    keepRate1 = tf.placeholder(tf.float32, name="keepRate1-placeholder")
    keepRate2 = tf.placeholder(tf.float32, name="keepRate2-placeholder")

Model:

# CONVOLUTION 1 - 1
with tf.name_scope('conv1_1'):
    filter1_1 = tf.Variable(tf.truncated_normal([3, 3, 1, 32], dtype=tf.float32,
                            stddev=1e-1), name='weights1_1')
    stride = [1,1,1,1]
    conv = tf.nn.conv2d(X, filter1_1, stride, padding='SAME')
    biases = tf.Variable(tf.constant(0.0, shape=[32], dtype=tf.float32),
                         trainable=True, name='biases1_1')
    out = tf.nn.bias_add(conv, biases)
    conv1_1 = tf.nn.relu(out)

# CONVOLUTION 1 - 2
with tf.name_scope('conv1_2'):
    filter1_2 = tf.Variable(tf.truncated_normal([3, 3, 32, 32], dtype=tf.float32,
                                                stddev=1e-1), name='weights1_2')
    conv = tf.nn.conv2d(conv1_1, filter1_2, [1,1,1,1], padding='SAME')
    biases = tf.Variable(tf.constant(0.0, shape=[32], dtype=tf.float32),
                         trainable=True, name='biases1_2')
    out = tf.nn.bias_add(conv, biases)
    conv1_2 = tf.nn.relu(out)

# POOL 1
with tf.name_scope('pool1'):
    pool1_1 = tf.nn.max_pool(conv1_2,
                             ksize=[1, 2, 2, 1],
                             strides=[1, 2, 2, 1],
                             padding='SAME',
                             name='pool1_1')
    pool1_1_drop = tf.nn.dropout(pool1_1, keepRate1)

# CONVOLUTION 2 - 1
with tf.name_scope('conv2_1'):
    filter2_1 = tf.Variable(tf.truncated_normal([3, 3, 32, 64], dtype=tf.float32,
                                                stddev=1e-1), name='weights2_1')
    conv = tf.nn.conv2d(pool1_1_drop, filter2_1, [1, 1, 1, 1], padding='SAME')
    biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),
                         trainable=True, name='biases2_1')
    out = tf.nn.bias_add(conv, biases)
    conv2_1 = tf.nn.relu(out)

# CONVOLUTION 2 - 2
with tf.name_scope('conv2_2'):
    filter2_2 = tf.Variable(tf.truncated_normal([3, 3, 64, 64], dtype=tf.float32,
                                                stddev=1e-1), name='weights2_2')
    conv = tf.nn.conv2d(conv2_1, filter2_2, [1, 1, 1, 1], padding='SAME')
    biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),
                         trainable=True, name='biases2_2')
    out = tf.nn.bias_add(conv, biases)
    conv2_2 = tf.nn.relu(out)

# POOL 2
with tf.name_scope('pool2'):
    pool2_1 = tf.nn.max_pool(conv2_2,
                             ksize=[1, 2, 2, 1],
                             strides=[1, 2, 2, 1],
                             padding='SAME',
                             name='pool2_1')
    pool2_1_drop = tf.nn.dropout(pool2_1, keepRate1)

#FULLY CONNECTED 1
with tf.name_scope('fc1') as scope:
    shape = int(np.prod(pool2_1_drop.get_shape()[1:]))
    fc1w = tf.Variable(tf.truncated_normal([shape, 512], dtype=tf.float32,
                                           stddev=1e-1), name='weights3_1')
    fc1b = tf.Variable(tf.constant(1.0, shape=[512], dtype=tf.float32),
                       trainable=True, name='biases3_1')
    pool2_flat = tf.reshape(pool2_1_drop, [-1, shape])
    out = tf.nn.bias_add(tf.matmul(pool2_flat, fc1w), fc1b)
    fc1 = tf.nn.relu(out)
    fc1_drop = tf.nn.dropout(fc1, keepRate2)

#FULLY CONNECTED 3 & SOFTMAX OUTPUT
with tf.name_scope('softmax') as scope:
    fc2w = tf.Variable(tf.truncated_normal([512, classes], dtype=tf.float32,
                                           stddev=1e-1), name='weights3_2')
    fc2b = tf.Variable(tf.constant(1.0, shape=[classes], dtype=tf.float32),
                       trainable=True, name='biases3_2')
    Ylogits = tf.nn.bias_add(tf.matmul(fc1_drop, fc2w), fc2b)
    Y = tf.nn.softmax(Ylogits)

numEpochs = 400
batchSize = 30
alpha = 1e-5

with tf.name_scope('cross_entropy'):
    print(Ylogits.shape)
    print(Y.shape)
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Ylogits, labels=Y_)
    loss = tf.reduce_mean(cross_entropy)

with tf.name_scope('accuracy'):
    correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(learning_rate=alpha).minimize(loss)

#Create Session and insert variables
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
Lena
  • 19
  • 5
  • How do you define fc1_drop? – JMA Dec 14 '17 at 17:57
  • @jafergas I added the code that defines fc1_drop above, since it is too long for a comment. KeepRate is defined as: keepRate2 = tf.placeholder(tf.float32, name="keepRate2-placeholder") – Lena Dec 14 '17 at 18:26

1 Answers1

1

The tensor shape (?, 30) denotes that the batch size is not set, so you can feed any batch size data to your graph, the problem is that then you can run into these kinds of problems, and need to keep track of the tensor shapes in your head.

The thing you need to fix is: either you have 30 images in one batch, but only 1 label in one batch, which needs to be fixed, because you cannot compute loss for 30 images with only one label, you either need to decrease number of images to 1 or increase label batch size to 30, it could also be that somewhere you are reshaping the tensors incorrectly.

I would look at where you read your data in, and then batch it, that is most likely where the problem will be, or at places where you are reshaping them.

Post your entire code, it would be more helpful.

Hasnain Raza
  • 681
  • 5
  • 10
  • As suspected, your batch size is 30, so your logits tensor is fine, but your label tensor isn't, specifically, you do: acc = sess.run([accuracy], feed_dict={X: x_train[(j*batchSize): ((j+1)*batchSize),:,:,:], Y_: np.array(y_train[(j*batchSize): ((j+1)*batchSize)]).reshape(1,30), keepRate1: 1, keepRate2: 1}) at 3 places in your code, you can see that you are reshaping your Y_ tensor to (1,30), and it doesn't match the shape of the logits tensor (30, 30). You need to load 30 labels, and then encode them correctly for 30 classes, so they also have the shape (30, 30). – Hasnain Raza Dec 14 '17 at 20:21