In [38]:
import typing
import tiny_dnn
import numpy as np
import pylab as pl

In [39]:
def generate_data() -> typing.Tuple[np.ndarray, np.ndarray]:
    x = np.random.rand(2, 1000) - 0.5
    y = np.maximum(0, np.minimum(1, np.round(np.sqrt(x[0, :] ** 2 + x[1, :] ** 2) + 0.1)))
    return x, y

In [72]:
x, y = generate_data()

In [67]:
pl.figure(figsize=(5, 5))

positive = x[:, y == 1]
negative = x[:, y == 0]
pl.scatter(positive[0, :], positive[1, :], c='r')
pl.scatter(negative[0, :], negative[1, :], c='b')
pl.show()



In [73]:
net = tiny_dnn.net.Net()
net.layers.append(tiny_dnn.layer.InputLayer(x, y))
net.layers.append(tiny_dnn.layer.FullConnectLayer(8, 'relu'))
net.layers.append(tiny_dnn.layer.FullConnectLayer(4, 'relu'))
net.layers.append(tiny_dnn.layer.FullConnectLayer(2, 'relu'))
net.layers.append(tiny_dnn.layer.FullConnectLayer(1, 'sigmoid'))

costs = []
lr = 0.1
for i in range(1, 3000 + 1):
    net.forward()
    cost = net.cost()
    costs.append(cost)

    if i % 100 == 0:
        print('Cost: {:.5f}'.format(cost))
    if i % 1000 == 0:
        lr *= 0.3

    net.backward()
    net.update(lr)


Cost: 0.66803
Cost: 0.60250
Cost: 0.45078
Cost: 0.28947
Cost: 0.19782
Cost: 0.17522
Cost: 0.18316
Cost: 0.15575
Cost: 0.12497
Cost: 0.08738
Cost: 0.07814
Cost: 0.07457
Cost: 0.07134
Cost: 0.06843
Cost: 0.06577
Cost: 0.06333
Cost: 0.06110
Cost: 0.05903
Cost: 0.05712
Cost: 0.05534
Cost: 0.05483
Cost: 0.05433
Cost: 0.05385
Cost: 0.05337
Cost: 0.05290
Cost: 0.05244
Cost: 0.05199
Cost: 0.05155
Cost: 0.05112
Cost: 0.05069

In [74]:
pl.plot(costs)
pl.show()



In [75]:
predict = np.round(net.data_out)
accuracy = 1.0 - np.mean(np.abs(predict - y))
print('Accuracy: {}'.format(accuracy))


Accuracy: 0.993

In [ ]: