Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tensorflow reshape tensor

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))
like image 771
Kendall Weihe Avatar asked Jun 16 '16 20:06

Kendall Weihe


People also ask

How do you flatten a TensorFlow tensor?

To flatten the tensor, we're going to use the TensorFlow reshape operation. So tf. reshape, we pass in our tensor currently represented by tf_initial_tensor_constant, and then the shape that we're going to give it is a -1 inside of a Python list.


1 Answers

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

like image 130
weitang114 Avatar answered Oct 23 '22 19:10

weitang114