0 votes
1 view
in AI and Deep Learning by (28.1k points)

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']



    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 Answer

0 votes
by (57.5k points)

You can proceed it easily with tf.reshape() without knowing the batch size.

follow the below syntax:

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 batch size is in the runtime. You can see it in tf.reshape().

Welcome to Intellipaat Community. Get your technical queries answered by top developers !