What does TensorFlow shape (?,) mean?

The comma means that the dimension is represented as a 1-elem tuple instead an int.

Each tensor, when created, is by default a n-dim:

import tensorflow as tf
t = tf.constant([1, 1, 1])
s = tf.constant([[1, 1, 1],[2,2,2]])

print("0) ", tf.shape(t))
print("1) ", tf.shape(s))

0)  Tensor("Shape_28:0", shape=(1,), dtype=int32)
1)  Tensor("Shape_29:0", shape=(2,), dtype=int32)

However, you can reshape it to get a more "whole" shape (i.e. nXm / nXmXr... dim):

print("2) ", tf.reshape(t, [3,1]))
print("3) ", tf.reshape(s, [2,3]))

2)  Tensor("Reshape_12:0", shape=(3, 1), dtype=int32)
3)  Tensor("Reshape_13:0", shape=(2, 3), dtype=int32)