Shengs
Shengs

Reputation: 11

What should my placeholders be for my TensorFlow regression with multiple features?

Hi, I'm trying to run Linear Regression using TensorFlow so I took this code and wish to fit my own dataset X_train (43, 5) and y_train (43,). Here's my code:

from __future__ import print_function

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
rng = numpy.random

# Parameters
learning_rate = 0.01
training_epochs = 1000
display_step = 50

# Data
train_X = X_train
train_Y = y_train
test_X = X_test
test_Y = y_test

n_samples = train_X.shape[0]
row = train_X.shape[0]
column = train_X.shape[1]

print(row, column)

# tf Graph Input
X = tf.placeholder("float", [row, column])
Y = tf.placeholder("float")

# Set model weights
#W = tf.Variable(rng.randn(), name="weight")
#b = tf.Variable(rng.randn(), name="bias")

W = tf.Variable(tf.zeros([column, 1]), name="weight")
b = tf.Variable(tf.zeros([1]), name="bias")

# Construct a linear model
pred = tf.add(tf.multiply(X, W), b)

# Mean squared error
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)

# Gradient descent
#  Note, minimize() knows to modify W and b because Variable objects are trainable=True by default
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()

# Start training
with tf.Session() as sess:

    # Run the initializer
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})

        # Display logs per epoch step
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "W=", sess.run(W), "b=", sess.run(b))

    print("Optimization Finished!")
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

    # Graphic display
    plt.plot(train_X, train_Y, 'ro', label='Original data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()

    print("Testing... (Mean square loss Comparison)")
    testing_cost = sess.run(
        tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * test_X.shape[0]),
        feed_dict={X: test_X, Y: test_Y})  # same function as cost above
    print("Testing cost=", testing_cost)
    print("Absolute mean square loss difference:", abs(
        training_cost - testing_cost))

    plt.plot(test_X, test_Y, 'bo', label='Testing data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()

I tried to follow this to match the dimensions

But I keep getting this error: ValueError: Dimensions must be equal, but are 43 and 5 for 'Mul_18' (op: 'Mul') with input shapes: [43,5], [5,1]. Setting the placeholders to random solves this issue but then triggers another dimensional error at any of the lines: sess.run(cost, feed_dict={X: train_X, Y:train_Y}). Some one please help!?

Upvotes: 1

Views: 220

Answers (1)

Prasad
Prasad

Reputation: 6034

You are trying to do matrix multiplication. So you should make use of tf.matmul.

The operation of tf.multiply does elementwise multiplication for which both the tensor's shapes must be same.

Upvotes: 1

Related Questions