Linear Regression in TensorFlowΒΆ

Credits: Forked from TensorFlow-Examples by Aymeric Damien

Linear regression implemented in TensorFlow demonstrates how the framework’s automatic differentiation and gradient descent optimizer work at the lowest level. Instead of using a closed-form solution (like the normal equation), TensorFlow iteratively adjusts the weight W and bias b to minimize the mean squared error between predictions and actual values. This iterative approach scales to problems where closed-form solutions do not exist – which is the case for every deep neural network.

The training loop feeds data points one at a time (stochastic gradient descent), computes the L2 loss, and updates parameters using GradientDescentOptimizer. Watching the cost decrease over epochs and the fitted line converge to the data builds intuition for how all neural network training works.

Note: This uses TensorFlow 1.x syntax. The concepts of loss functions, optimizers, and training loops apply directly to TensorFlow 2.x and PyTorch as well.

Setup: Refer to the setup instructions

import tensorflow as tf
import numpy
import matplotlib.pyplot as plt
rng = numpy.random
# Parameters
learning_rate = 0.01
training_epochs = 2000
display_step = 50
# Training Data
train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,7.042,10.791,5.313,7.997,5.654,9.27,3.1])
train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,2.827,3.465,1.65,2.904,2.42,2.94,1.3])
n_samples = train_X.shape[0]
# tf Graph Input
X = tf.placeholder("float")
Y = tf.placeholder("float")
# Create Model

# Set model weights
W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")
# Construct a linear model
activation = tf.add(tf.mul(X, W), b)
# Minimize the squared errors
cost = tf.reduce_sum(tf.pow(activation-Y, 2))/(2*n_samples) #L2 loss
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent
# Initializing the variables
init = tf.initialize_all_variables()
# Launch the graph
with tf.Session() as sess:
    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 % display_step == 0:
            print "Epoch:", '%04d' % (epoch+1), "cost=", \
                "{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y:train_Y})), \
                "W=", sess.run(W), "b=", sess.run(b)

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

    #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()
from IPython.display import Image
Image(filename='linearreg.png')