Source code for untwist.neuralnetworks.mlp

"""
Multi-Layer Perceptron implementation, using Theano
"""


import numpy as np
import matplotlib.pyplot as plt
import theano
import theano.tensor as T
import cPickle
from ..base import Model, ArgumentException
        

[docs]class Layer(object): """ Generic feed-forward layer (can be hidden or output) """ def __init__(self, input, n_in, n_out, W = None, b = None, activation = T.nnet.sigmoid): self.input = input if W is None: W_values = np.asarray( np.random.RandomState().uniform( low = -np.sqrt(6. / (n_in + n_out)), high = np.sqrt(6. / (n_in + n_out)), size = (n_in, n_out) ), dtype = theano.config.floatX ) if activation == T.nnet.sigmoid: W_values *= 4 W = theano.shared(value = W_values, name='W', borrow = True) if b is None: b_values = np.zeros((n_out,), dtype = theano.config.floatX) b = theano.shared(value = b_values, name = 'b', borrow = True) self.W = W self.b = b lin_output = T.dot(input, self.W) + self.b self.output = ( lin_output if activation is None else activation(lin_output) ) self.params = [self.W, self.b]
[docs]class MLP(object): """ Multi-Layer Perceptron network, specified by the size of the input, the output and an arbitrary number of hidden layers. """ def __init__(self, input_size, output_size, hidden_sizes, activation = T.nnet.sigmoid): self.hidden_layers = [] self.params = [] self.input = T.matrix('x') self.target = T.matrix('y') for i, layer_size in enumerate(hidden_sizes): if i == 0: layer_input_size = input_size layer_input = self.input else: layer_input_size = hidden_sizes[i - 1] layer_input = self.hidden_layers[-1].output layer = Layer(layer_input, layer_input_size, layer_size, activation = activation) self.hidden_layers.append(layer) self.params.extend(layer.params) self.output_layer = Layer(self.hidden_layers[-1].output, hidden_sizes[-1], output_size) self.params.extend(self.output_layer.params) self.output = self.output_layer.output self.cost = T.sum((self.output - self.target)**2)
[docs] def save(self, fname): hidden = [{'W':layer.W.eval(),'b':layer.b.eval()} for layer in self.hidden_layers] output = {'W':self.output_layer.W.eval(),'b':self.output_layer.b.eval()} model_params = {'hidden':hidden,'output':output} with open(fname, 'wb') as f: cPickle.dump(model_params, f)
[docs] def load(self, fname): with open(fname, 'rb') as f: new_params = cPickle.load(f) for i, l in enumerate(self.hidden_layers): l.W.set_value(new_params['hidden'][i]['W']) l.b.set_value(new_params['hidden'][i]['b']) self.output_layer.W.set_value(new_params['output']['W']) self.output_layer.b.set_value(new_params['output']['b'])
[docs]class Activations: """ Some activation functions not available in theano. """ @classmethod
[docs] def ReLU(cls): return lambda x: T.switch(x < 0, 0, x)
@classmethod
[docs] def ReLU2(cls): return lambda x: T.log(1+T.exp(x))