title: Tensorflow : logits and labels must have the same first dimension
body: <p>I am new in tensoflow and I want to adapt the MNIST tutorial <a href="https://www.tensorflow.org/tutorials/layers" rel="noreferrer">https://www.tensorflow.org/tutorials/layers</a> with my own data (images of 40x40).
  This is my model function : </p>
  
  <pre><code>def cnn_model_fn(features, labels, mode):
          # Input Layer
          input_layer = tf.reshape(features, [-1, 40, 40, 1])
  
          # Convolutional Layer #1
          conv1 = tf.layers.conv2d(
                  inputs=input_layer,
                  filters=32,
                  kernel_size=[5, 5],
                  #  To specify that the output tensor should have the same width and height values as the input tensor
                  # value can be "same" ou "valid"
                  padding="same",
                  activation=tf.nn.relu)
  
          # Pooling Layer #1
          pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
  
          # Convolutional Layer #2 and Pooling Layer #2
          conv2 = tf.layers.conv2d(
                  inputs=pool1,
                  filters=64,
                  kernel_size=[5, 5],
                  padding="same",
                  activation=tf.nn.relu)
          pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
  
          # Dense Layer
          pool2_flat = tf.reshape(pool2, [-1, 10 * 10 * 64])
          dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
          dropout = tf.layers.dropout(
                  inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
  
          # Logits Layer
          logits = tf.layers.dense(inputs=dropout, units=2)
  
          predictions = {
              # Generate predictions (for PREDICT and EVAL mode)
              "classes":       tf.argmax(input=logits, axis=1),
              # Add `softmax_tensor` to the graph. It is used for PREDICT and by the
              # `logging_hook`.
              "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
          }
  
          if mode == tf.estimator.ModeKeys.PREDICT:
              return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
  
          # Calculate Loss (for both TRAIN and EVAL modes)
          loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
  
          # Configure the Training Op (for TRAIN mode)
          if mode == tf.estimator.ModeKeys.TRAIN:
              optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
              train_op = optimizer.minimize(
                      loss=loss,
                      global_step=tf.train.get_global_step())
              return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
  
          # Add evaluation metrics (for EVAL mode)
          eval_metric_ops = {
              "accuracy": tf.metrics.accuracy(
                      labels=labels, predictions=predictions["classes"])}
          return tf.estimator.EstimatorSpec(
                  mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
  </code></pre>
  
  <p>I have a shape size error between labels and logits : </p>
  
  <p><strong>InvalidArgumentError (see above for traceback): logits and labels must have the same first dimension, got logits shape [3,2] and labels shape [1]</strong> </p>
  
  <p>filenames_array is an array of 16 string </p>
  
  <pre><code>["file1.png", "file2.png", "file3.png", ...]
  </code></pre>
  
  <p>and labels_array is an array of 16 integer </p>
  
  <pre><code>[0,0,1,1,0,1,0,0,0,...]
  </code></pre>
  
  <p>The main function is :</p>
  
  <pre><code># Create the Estimator
  mnist_classifier = tf.estimator.Estimator(model_fn=cnn_model_fn, model_dir="/tmp/test_convnet_model")
  
  # Train the model
  cust_train_input_fn = lambda: train_input_fn_custom(
          filenames_array=filenames, labels_array=labels, batch_size=1)
  
  mnist_classifier.train(
          input_fn=cust_train_input_fn,
          steps=20000,
          hooks=[logging_hook])
  </code></pre>
  
  <p>I tried to reshape logits without success :</p>
  
  <p>logits = tf.reshape(logits, [1, 2])</p>
  
  <p>I need your help, thanks</p>
  
  <hr>
  
  <p><strong>EDIT</strong></p>
  
  <p>After more time to search, in the first line of my model function</p>
  
  <pre><code>input_layer = tf.reshape(features, [-1, 40, 40, 1])
  </code></pre>
  
  <p>the "-1" that signifies that the batch_size dimension will be dynamically calculated have here the value "3". The same "3" as in my error : <strong>logits and labels must have the same first dimension, got logits shape [3,2] and labels shape [1]</strong></p>
  
  <p>If I force the value to "1" I have this new error :</p>
  
  <p><strong>Input to reshape is a tensor with 4800 values, but the requested shape has 1600</strong></p>
  
  <p>Maybe a problem with my features ?</p>
  
  <hr>
  
  <p><strong>EDIT2 :</strong> </p>
  
  <p>the complete code is here : <a href="https://gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e" rel="noreferrer">https://gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e</a></p>
  
  <hr>
  
  <p><strong>EDIT3</strong></p>
  
  <p>I updated the gist with </p>
  
  <pre><code>logits = tf.layers.dense(inputs=dropout, units=1)
  </code></pre>
  
  <p><a href="https://gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e" rel="noreferrer">https://gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e</a></p>
  
  <p>But I don't completely understand your answer about the batch size, how the batch size can be 3 here whereas I choose a batch size of 1 ? </p>
  
  <p>If I choose a batch_size = 3 I have this error :
  <strong>logits and labels must have the same first dimension, got logits shape [9,1] and labels shape [3]</strong></p>
  
  <p>I tried to reshape labels : </p>
  
  <pre><code>labels = tf.reshape(labels, [3, 1])
  </code></pre>
  
  <p>and I updated features and labels structure : </p>
  
  <pre><code>    filenames_train = [['blackcorner-data/1.png', 'blackcorner-data/2.png', 'blackcorner-data/3.png',
                     'blackcorner-data/4.png', 'blackcorner-data/n1.png'],
                     ['blackcorner-data/n2.png',
                     'blackcorner-data/n3.png', 'blackcorner-data/n4.png',
                     'blackcorner-data/11.png', 'blackcorner-data/21.png'],
                     ['blackcorner-data/31.png',
                     'blackcorner-data/41.png', 'blackcorner-data/n11.png', 'blackcorner-data/n21.png',
                     'blackcorner-data/n31.png']
                     ]
  
  labels = [[0, 0, 0, 0, 1], [1, 1, 1, 0, 0], [0, 0, 1, 1, 1]]
  </code></pre>
  
  <p>but without success...</p>