In [1]:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
x = np.linspace(-10,10,100)
y = np.linspace(-10,10,100)
X, Y = np.meshgrid(x,y)
X_f = X.flatten()
Y_f = Y.flatten()
data = zip(X_f, Y_f)

def draw3D(X, Y, Z, angle):
    fig = plt.figure(figsize=(15,7))
    ax = Axes3D(fig)
    ax.view_init(angle[0], angle[1])
    ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='rainbow')

class FC:
    def __init__(self, in_num, out_num, lr = 0.01):
        self._in_num = in_num
        self._out_num = out_num
        self.w = np.random.randn(out_num, in_num) * 10
        self.b = np.zeros(out_num)
        self.lr = lr
    def _sigmoid(self, in_data):
        return 1 / (1 + np.exp(-in_data))
    def forward(self, in_data):
        self.topVal = self._sigmoid(np.dot(self.w, in_data) + self.b)
        self.bottomVal = in_data
        return self.topVal

In [2]:
sigmoid = 1 / (1 + np.exp(-x))
plt.plot(x,sigmoid)


Out[2]:
[<matplotlib.lines.Line2D at 0x1063ed390>]

In [3]:
tanh = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
plt.plot(x,tanh)


Out[3]:
[<matplotlib.lines.Line2D at 0x10652a790>]

In [4]:
fc = FC(2, 1)
Z1 = np.array([fc.forward(d) for d in data])
Z1 = Z1.reshape((100,100))
draw3D(X, Y, Z1, (40, -45))


/Users/david/anaconda/lib/python2.7/site-packages/matplotlib/collections.py:590: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  if self._edgecolors == str('face'):

In [5]:
fc = FC(2, 3)
fc.w = np.array([[0.4, 0.6],[0.3,0.7],[0.2,0.8]])
fc.b = np.array([0.5,0.5,0.5])

fc2 = FC(3, 1)
fc2.w = np.array([0.3, 0.2, 0.1])
fc2.b = np.array([0.5])

Z1 = np.array([fc.forward(d) for d in data])
Z2 = np.array([fc2.forward(d) for d in Z1])
Z2 = Z2.reshape((100,100))

draw3D(X, Y, Z2, (40, -45))



In [6]:
fc = FC(2, 3)
fc.w = np.array([[-0.4, 1.6],[-0.3,0.7],[0.2,-0.8]])
fc.b = np.array([-0.5,0.5,0.5])

fc2 = FC(3, 1)
fc2.w = np.array([-3, 2, -1])
fc2.b = np.array([0.5])

Z1 = np.array([fc.forward(d) for d in data])
Z2 = np.array([fc2.forward(d) for d in Z1])
Z2 = Z2.reshape((100,100))

draw3D(X, Y, Z2,(70,60))



In [7]:
fc = FC(2, 4)
fc.b = np.array([-0.5,-0.5,0.5, 0.5])

fc2 = FC(4, 1)
fc2.b = np.array([0.5])

Z1 = np.array([fc.forward(d) for d in data])
Z2 = np.array([fc2.forward(d) for d in Z1])
Z2 = Z2.reshape((100,100))

In [8]:
draw3D(X, Y, Z2,(75,-60))



In [13]:
fc = FC(2, 100)

fc2 = FC(100, 1)

Z1 = np.array([fc.forward(d) for d in data])
Z2 = np.array([fc2.forward(d) for d in Z1])
Z2 = Z2.reshape((100,100))

In [14]:
draw3D(X, Y, Z2,(75,80))



In [17]:
fc = FC(2, 100)
# fc.b = np.array([-0.5,-0.5,0.5, 0.5])

fc2 = FC(100, 100)
# fc2.b = np.array([0.5])
fc3 = FC(100, 1)

Z1 = np.array([fc.forward(d) for d in data])
Z2 = np.array([fc2.forward(d) for d in Z1])
Z3 = np.array([fc3.forward(d) for d in Z2])
Z3 = Z3.reshape((100,100))

In [18]:
draw3D(X, Y, Z3,(75,80))



In [21]:
fc = FC(2, 10)
fc2 = FC(10, 20)
fc3 = FC(20, 40)
fc4 = FC(40, 80)
fc5 = FC(80, 1)

Z1 = np.array([fc.forward(d) for d in data])
Z2 = np.array([fc2.forward(d) for d in Z1])
Z3 = np.array([fc3.forward(d) for d in Z2])
Z4 = np.array([fc4.forward(d) for d in Z3])
Z5 = np.array([fc5.forward(d) for d in Z4])
Z5 = Z5.reshape((100,100))

In [22]:
draw3D(X, Y, Z5,(75,80))