In [4]:
# Import the required packages
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import scipy
import math
import random
import string
import tensorflow as tf
random.seed(123)
# Display plots inline
%matplotlib inline
# Define plot's default figure size
matplotlib.rcParams['figure.figsize'] = (10.0, 8.0)
In [90]:
# Read the datasets
train = pd.read_csv("../data/intro_to_ann.csv")
print (train.head())
X, Y = np.array(train.ix[:,0:2]), np.array(train.ix[:,2])
print(X.shape, Y.shape)
# Get sample and feature size from training data
size, features = X.shape
print("Sample Size =",size,"\nNumber of Features =",features)
plt.scatter(X[:,0], X[:,1], s=40, c=Y, cmap=plt.cm.BuGn)
Out[90]:
In [83]:
# Parameters
iterations = 2500
labels = 2
hiddenNodes = 4
learningRate = 0.01
labelsArray = (np.arange(labels) == Y[:,None]).astype(np.float32)
print(labelsArray[0:10])
In [95]:
# Tensorflow Graph Placeholders
x = tf.placeholder(tf.float32, shape=[None, features])
y = tf.placeholder(tf.float32, shape=[None, labels])
# Weights for NN Random Initially
wHid = tf.Variable(tf.random_normal([features, hiddenNodes]))
bHid = tf.Variable(tf.zeros([hiddenNodes]))
W = tf.Variable(tf.random_normal([hiddenNodes, labels]))
b = tf.Variable(tf.zeros([labels]))
# Create Model
hiddenLayer = tf.nn.softmax(tf.add(tf.matmul(x,wHid), bHid))
model = tf.nn.softmax(tf.add(tf.matmul(hiddenLayer,W),b))
# Error calculation, Mean Squared
error = -tf.reduce_sum(y*tf.log(model))
gradDescent = tf.train.GradientDescentOptimizer(learningRate).minimize(error)
# If model is correct
correctAnswer = tf.equal(tf.argmax(model,1), tf.argmax(y,1))
correctAccuracy = tf.reduce_mean(tf.cast(correctAnswer, tf.float32))
initialize = tf.initialize_all_variables()
In [97]:
# Find optimal weights and error
errors = []
with tf.Session() as session:
session.run(initialize)
for epoch in range(iterations):
# Gradient descent on each iteration and find accuracy
gradDescent.run(feed_dict={x:X, y:labelsArray})
accuracy = correctAccuracy.eval(feed_dict={x:X, y:labelsArray})
# Update errors
errors.append(1-accuracy)
summary_writer = tf.train.SummaryWriter('./logs',session.graph)
print("Optimization Finished!")
print("Weight Matrix\n", session.run(W), "\nBias Matrix\n", session.run(b))
print("Final error:", errors[-1])
In [98]:
plt.plot([np.mean(errors[i-50:i]) for i in range(len(errors))])
plt.show()
In [ ]: