personal repo for experimenting with neural networks
Go to file
2017-09-18 04:42:41 +00:00
onn_core.py allow multi-input and multi-output models 2017-09-16 18:28:05 +00:00
onn_mnist.py remove keras stuff so it won't show on google 2017-09-18 04:42:41 +00:00
onn.py use MomentumClip in warmup for stability 2017-09-16 17:30:52 +00:00
README.md yeah probably not 2017-07-12 09:07:22 +00:00

neural network stuff

not unlike my dsp repo, this is a bunch of half-baked python code that's kinda handy. i give no guarantee anything provided here is correct.

don't expect commits, docs, or comments to be any verbose.

other stuff

if you're coming here from Google: sorry, keep searching. i know Google sometimes likes to give random repositories a high search ranking. maybe consider one of the following:

  • keras for easy tensor-optimized networks. strong tensorflow integration as of version 2.0. also check out the keras-contrib library for more components based on recent papers.
  • theano's source code contains pure numpy test methods to reference against.
  • minpy for tensor-powered numpy routines and automatic differentiation.
  • autograd for automatic differentiation without tensors.

dependencies

python 3.5+

numpy scipy h5py sklearn dotmap

minimal example

#!/usr/bin/env python3
from onn_core import *
bs = 500
lr = 0.0005 * np.sqrt(bs)
reg = L1L2(3.2e-5, 3.2e-4)
final_reg = L1L2(3.2e-5, 1e-3)

def get_mnist(fn='mnist.npz'):
    with np.load(fn) as f:
        return f['X_train'], f['Y_train'], f['X_test'], f['Y_test']
inputs, outputs, valid_inputs, valid_outputs = get_mnist()

x = Input(shape=inputs.shape[1:])
y = x
y = y.feed(Flatten())
y = y.feed(Dense(y.output_shape[0], init=init_he_normal, reg_w=reg, reg_b=reg))
y = y.feed(Relu())
y = y.feed(Dense(y.output_shape[0], init=init_he_normal, reg_w=reg, reg_b=reg))
y = y.feed(Dropout(0.05))
y = y.feed(Relu())
y = y.feed(Dense(10, init=init_glorot_uniform, reg_w=final_reg, reg_b=final_reg))
y = y.feed(Softmax())
model = Model(x, y, unsafe=True)

optim = Adam()
learner = SGDR(optim, epochs=20, rate=lr, restarts=2)
ritual = Ritual(learner=learner, loss=CategoricalCrossentropy(), mloss=Accuracy())
ritual.prepare(model)
while learner.next():
    print("epoch", learner.epoch)
    mloss, _ = ritual.train_batched(inputs, outputs, batch_size=bs, return_losses=True)
    print("train accuracy", "{:6.2f}%".format(mloss * 100))

def print_error(name, inputs, outputs):
    loss, mloss, _, _ = ritual.test_batched(inputs, outputs, bs, return_losses='both')
    predicted = ritual.model.forward(inputs, deterministic=True)
    print(name + " loss", "{:12.6e}".format(loss))
    print(name + " accuracy", "{:6.2f}%".format(mloss * 100))
print_error("train", inputs, outputs)
print_error("valid", valid_inputs, valid_outputs)

contributing

i'm just throwing this code out there, so i don't actually expect anyone to contribute, but if you do find a blatant issue, maybe yell at me on twitter.