0 votes
1 view
in AI and Deep Learning by (19.2k 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']

        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 Answer

0 votes
by (42.6k 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().

...