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)) 
1

1 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().

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy