I have a prediction tensor (the actual network)
(Pdb) pred <tf.Tensor 'transpose_1:0' shape=(?, 200, 200) dtype=float32> and a y tensor
y = tf.placeholder("float", [None, n_steps, n_classes]) (Pdb) y <tf.Tensor 'Placeholder_1:0' shape=(?, 200, 200) dtype=float32> I want to feed it into
f.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
However, it requires the dimensions to be [batch_size, num_classes]
So I want to reshape both pred and y so that they look like this
<tf.Tensor 'transpose_1:0' shape=(?, 40000) dtype=float32> But when I run reshape I get
(Pdb) tf.reshape(pred, [40000]) <tf.Tensor 'Reshape_1:0' shape=(40000,) dtype=float32> instead of (?,40000) how can I maintain that None dimension? (the batch size dimension)
I've also posted all of the relevant code...
# tf Graph input x = tf.placeholder("float", [None, n_steps, n_input]) y = tf.placeholder("float", [None, n_steps, n_classes]) # Define weights weights = { 'hidden': tf.Variable(tf.random_normal([n_hidden, n_classes]), dtype="float32"), 'out': tf.Variable(tf.random_normal([n_hidden, n_classes]), dtype="float32") } biases = { 'hidden': tf.Variable(tf.random_normal([n_hidden]), dtype="float32"), 'out': tf.Variable(tf.random_normal([n_classes]), dtype="float32") } def RNN(x, weights, biases): # Prepare data shape to match `rnn` function requirements # Current data input shape: (batch_size, n_steps, n_input) # Permuting batch_size and n_steps x = tf.transpose(x, [1, 0, 2]) # Reshaping to (n_steps*batch_size, n_input) x = tf.reshape(x, [-1, n_input]) # Split to get a list of 'n_steps' tensors of shape (batch_size, n_hidden) # This input shape is required by `rnn` function x = tf.split(0, n_steps, x) # Define a lstm cell with tensorflow lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0, state_is_tuple=True) outputs, states = rnn.rnn(lstm_cell, x, dtype=tf.float32) output_matrix = [] for i in xrange(n_steps): temp = tf.matmul(outputs[i], weights['out']) + biases['out'] # temp = tf.matmul(weights['hidden'], outputs[i]) + biases['hidden'] output_matrix.append(temp) pdb.set_trace() return output_matrix pred = RNN(x, weights, biases) # temp = RNN(x) # pdb.set_trace() # pred = tf.shape(temp) pred = tf.pack(tf.transpose(pred, [1,0,2])) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) 11 Answer
I'm the author of one of the answers of the other question in Yaroslav's comment. You can use -1 for the None dimension.
You can do it easily with tf.reshape() without knowing the batch size.
x = tf.placeholder(tf.float32, shape=[None, 9,2]) shape = x.get_shape().as_list() # a list: [None, 9, 2] dim = numpy.prod(shape[1:]) # dim = prod(9,2) = 18 x2 = tf.reshape(x, [-1, dim]) # -1 means "all" The -1 in the last line means the whole column no matter what the batchsize is in the runtime. You can see it in tf.reshape().