Valeria
Valeria

Reputation: 1210

Shapes in Tensorflow

I am new to Tensorflow and I have problems with combining shapes (n,) with shapes (n,1).

I have this code:

if __name__ == '__main__':
    trainSetX, trainSetY = utils.load_train_set()

    # create placeholders & variables
    X = tf.placeholder(tf.float32, shape=(num_of_features,))
    y = tf.placeholder(tf.float32, shape=(1,))
    W, b = initialize_params()

    # predict y
    y_estim = linear_function(X, W, b)
    y_pred = tf.sigmoid(y_estim)

    # set the optimizer
    loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=y_pred)
    loss_mean = tf.reduce_mean(loss)
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=alpha).minimize(loss_mean)

    # training phase
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
        for idx in range(num_of_examples):
            cur_x, cur_y = trainSetX[idx], trainSetY[idx]
            _, c = sess.run([optimizer, loss_mean], feed_dict={X: cur_x, y: cur_y})

I am trying to implement a stochastic gradient descent by feeding one example at the time. The problem is that it seems to feed the data in shape (num_of_features,), while I need (num_of_features,1) for the correct usage of the other functions.

For example, the code given before causes error when it comes to calculating the prediction of y with this function:

def linear_function(x, w, b):
    y_est = tf.add(tf.matmul(w, x), b)
    return y_est

The error is:

ValueError: Shape must be rank 2 but is rank 1 for 'MatMul' (op: 'MatMul') with input shapes: [1,3197], [3197].

I was trying to use tf.reshape with X and y to somehow solve this problem, but it caused errors in other places.

Is it possible to feed the data in feed_dict={X: cur_x, y: cur_y} in "correct" shape?

Or what is the way to properly implement this?

Thanks.

Upvotes: 0

Views: 149

Answers (1)

LYu
LYu

Reputation: 2416

For matrix multiplications, you need to follow the rule of shapes

(a, b) * (b, c) = (a, c)

Which means you do need to reshape it since the shapes in your code are not following it. Showing what error you got after reshape would help.

Hope this gives you some hint

import tensorflow as tf

a = tf.constant([1, 2], shape=[1, 2])
b = tf.constant([7, 8], shape=[2])

print(a.shape) # => (1, 2)
print(b.shape) # => (2,)

sess = tf.Session()

# r = tf.matmul(a, b)
# print(sess.run(r)) # this gives you error

c = tf.reshape(b, [2, 1])
print(c.shape) # => (2, 1)

r = tf.matmul(a, c)
foo = tf.reshape(r, [1])
foo = sess.run(foo)
print(foo) # this gives you [23]

Upvotes: 1

Related Questions