Skip to content

Commit

Permalink
conf
Browse files Browse the repository at this point in the history
  • Loading branch information
pchavanne committed Dec 10, 2016
1 parent 58520ba commit 7614c21
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 68 deletions.
2 changes: 1 addition & 1 deletion examples/hp_grid_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def grid_search():
model.hp = hp
# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), name='Input')
# Dense Layer 1
l_hid1 = DenseLayer(incoming=l_in, nb_units=5, W=hp.initialisation, l1=hp.l1_reg,
l2=hp.l2_reg, activation=hp.activation, name='Hidden layer 1')
Expand Down
2 changes: 1 addition & 1 deletion examples/model_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@

# Create connected layers
# Input layer
l_in = yadll.layers.InputLayer(shape=(hp.batch_size, 28 * 28), name='Input')
l_in = yadll.layers.InputLayer(input_shape=(hp.batch_size, 28 * 28), name='Input')
# Dropout Layer 1
l_dro1 = yadll.layers.Dropout(incoming=l_in, corruption_level=0.4, name='Dropout 1')
# Dense Layer 1
Expand Down
30 changes: 15 additions & 15 deletions examples/networks.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def logistic_regression(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Logistic regression Layer
l_out = LogisticRegression(incoming=l_in, nb_class=10, name='Logistic regression')

Expand All @@ -59,7 +59,7 @@ def mlp(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Dense Layer
l_hid1 = DenseLayer(incoming=l_in, nb_units=500, W=glorot_uniform, l1=hp.l1_reg,
l2=hp.l2_reg, activation=tanh, name='Hidden layer 1')
Expand Down Expand Up @@ -92,7 +92,7 @@ def dropout(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Dropout Layer
l_dro1 = Dropout(incoming=l_in, corruption_level=0.4, name='Dropout 1')
# Dense Layer
Expand Down Expand Up @@ -130,7 +130,7 @@ def dropconnect(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# DropConnect Layer
l_dc1 = Dropconnect(incoming=l_in, nb_units=500, corruption_level=0.4,
W=glorot_uniform, activation=relu, name='Dropconnect layer 1')
Expand Down Expand Up @@ -165,7 +165,7 @@ def convpool(input_var=None):
filter_shape = (20, 1, 5, 5) # (number of filters, nb input feature maps, filter height, filter width)
poolsize = (2, 2) # downsampling factor per (row, col)
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# ConvLayer needs 4D Tensor
l_rs = ReshapeLayer(incoming=l_in, output_shape=image_shape)
# ConvPool Layer
Expand Down Expand Up @@ -198,7 +198,7 @@ def lenet5(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# ConvLayer needs 4D Tensor
image_shape = (None, 1, 28, 28)
l_rs = ReshapeLayer(incoming=l_in, output_shape=image_shape)
Expand Down Expand Up @@ -251,7 +251,7 @@ def autoencoder(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Auto Encoder Layer
l_ae1 = AutoEncoder(incoming=l_in, nb_units=500, hyperparameters=hp_ae,
corruption_level=0.0, name='AutoEncoder')
Expand Down Expand Up @@ -285,7 +285,7 @@ def denoising_autoencoder(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Auto Encoder Layer
l_ae1 = AutoEncoder(incoming=l_in, nb_units=500, hyperparameters=hp_ae,
corruption_level=0.3, activation=relu, name='Denoising AutoEncoder')
Expand Down Expand Up @@ -319,7 +319,7 @@ def gaussian_denoising_autoencoder(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Auto Encoder Layer
l_ae1 = AutoEncoder(incoming=l_in, nb_units=500, hyperparameters=hp_ae, sigma=0.3,
activation=relu, name='Gaussian Denoising AutoEncoder')
Expand Down Expand Up @@ -353,7 +353,7 @@ def contractive_denoising_autoencoder(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Auto Encoder Layer
l_ae1 = AutoEncoder(incoming=l_in, nb_units=500, hyperparameters=hp_ae, contraction_level=0.3,
activation=relu, name='Contractive Denoising AutoEncoder')
Expand Down Expand Up @@ -387,7 +387,7 @@ def stacked_denoising_autoencoder(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Auto Encoder Layer
l_ae1 = AutoEncoder(incoming=l_in, nb_units=500, hyperparameters=hp_ae,
corruption_level=0.2, name='Denoising AutoEncoder 1')
Expand Down Expand Up @@ -425,7 +425,7 @@ def rbm(input_var=None):

# Create connected layers
# Input layer
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
# Restricted Boltzmann Machine Layer
l_rbm1 = RBM(incoming=l_in, nb_units=500, hyperparameters=hp_ae,
name='Restricted Boltzmann Machine')
Expand Down Expand Up @@ -458,7 +458,7 @@ def dbn(input_var=None):
hp_ae('learning_rate', 0.01)

# Create connected layers
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
l_rbm1 = RBM(incoming=l_in, nb_units=500, hyperparameters=hp_ae,
name='Restricted Boltzmann Machine 1')
l_rbm2 = RBM(incoming=l_rbm1, nb_units=500, hyperparameters=hp_ae,
Expand Down Expand Up @@ -486,7 +486,7 @@ def rnn(input_var=None):
hp('patience', 500)

# Create connected layers
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
l_rnn = RNN(incoming=l_in, n_hidden=100, n_out=28 * 28, name='Recurrent Neural Network')
l_out = LogisticRegression(incoming=l_rnn, nb_class=10, name='Logistic regression')

Expand All @@ -510,7 +510,7 @@ def lstm(input_var=None):
hp('patience', 500)

# Create connected layers
l_in = InputLayer(shape=(None, 28 * 28), input_var=input_var, name='Input')
l_in = InputLayer(input_shape=(None, 28 * 28), input_var=input_var, name='Input')
l_lstm = LSTM(incoming=l_in, n_hidden=100, n_out=28 * 28, name='Long Short Term Memory')
l_out = LogisticRegression(incoming=l_lstm, nb_class=10, name='Logistic regression')

Expand Down
41 changes: 31 additions & 10 deletions examples/updates_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,19 @@

# Create connected layers
# Input layer
l_in = yadll.layers.InputLayer(shape=(hp.batch_size, 28 * 28)) #, name='Input')
l_in = yadll.layers.InputLayer(input_shape=(hp.batch_size, 28 * 28))
# Dropout Layer 1
l_dro1 = yadll.layers.Dropout(incoming=l_in, corruption_level=0.5)#, name='Dropout 1')
l_dro1 = yadll.layers.Dropout(incoming=l_in, corruption_level=0.5)
# Dense Layer 1
l_hid1 = yadll.layers.DenseLayer(incoming=l_dro1, nb_units=500, W=yadll.init.glorot_uniform,
l1=hp.l1_reg, l2=hp.l2_reg, activation=yadll.activation.relu) #,
#name='Hidden layer 1')
l1=hp.l1_reg, l2=hp.l2_reg, activation=yadll.activation.relu)
# Dropout Layer 2
l_dro2 = yadll.layers.Dropout(incoming=l_hid1, corruption_level=0.25)#, name='Dropout 2')
l_dro2 = yadll.layers.Dropout(incoming=l_hid1, corruption_level=0.25)
# Dense Layer 2
l_hid2 = yadll.layers.DenseLayer(incoming=l_dro2, nb_units=500, W=yadll.init.glorot_uniform,
l1=hp.l1_reg, l2=hp.l2_reg, activation=yadll.activation.relu,
)#name='Hidden layer 2')
l1=hp.l1_reg, l2=hp.l2_reg, activation=yadll.activation.relu)
# Logistic regression Layer
l_out = yadll.layers.LogisticRegression(incoming=l_hid2, nb_class=10, l1=hp.l1_reg,
l2=hp.l2_reg)#, name='Logistic regression')
l_out = yadll.layers.LogisticRegression(incoming=l_hid2, nb_class=10, l1=hp.l1_reg, l2=hp.l2_reg)

# Create network and add layers
net = yadll.network.Network('2 layers mlp with dropout')
Expand All @@ -66,6 +63,9 @@
# updates method
model.updates = yadll.updates.sgd

# saving configuration
conf = model.to_conf()

# train the model and save it to file at each best
model.train()

Expand All @@ -83,4 +83,25 @@
print predicted_values
print test_set_y[:30]

print model
# Reconstruction of the model from configuration
model_2 = yadll.model.Model()
model_2.from_conf(conf)

import json
with open('model.json', 'w') as f:
json.dump(model.to_json(),f)

for layer in layers:
l = getattr(yadll.layers, 'InputLayer')(vars(model.network.layers[0]))


class A(object):
def __init__(self, a, b=1, **kwargs):
self.a=a
self.b=b

def p(self):
print self.a



2 changes: 1 addition & 1 deletion yadll/hyperparameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,5 +74,5 @@ def reset(self):
self.__setattr__(name, value)
self.iteration = 0

def to_json(self):
def to_conf(self):
return self.hp_value
50 changes: 22 additions & 28 deletions yadll/layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Layer(object):
"""
nb_instances = 0

def __init__(self, incoming, name=None):
def __init__(self, incoming, name=None, **kwargs):
"""
The base class that represent a single layer of any neural network.
It has to be subclassed by any kind of layer.
Expand Down Expand Up @@ -107,14 +107,19 @@ def get_output(self, **kwargs):
"""
raise NotImplementedError

def to_json(self):
json = {'name': self.name,
'input shape': self.input_shape}
if self.input_layer is None:
json['input layer'] = 'no input layer'
else:
json['input layer'] = self.input_layer.name
return json
def to_conf(self):
conf = self.__dict__.copy()
for key in ['id', 'params', 'reguls']:
conf.pop(key, None)
if conf['input_layer']:
conf['input_layer'] = conf['input_layer'].name
if 'activation' in conf:
conf['activation'] = conf['activation'].__name__
conf['type'] = self.__class__.__name__
return conf

def from_conf(self, conf):
self.__dict__.update(conf)


class InputLayer(Layer):
Expand All @@ -125,7 +130,7 @@ class InputLayer(Layer):
"""
nb_instances = 0

def __init__(self, shape, input_var=None, **kwargs):
def __init__(self, input_shape, input=None, **kwargs):
"""
The input layer of any network
Expand All @@ -134,19 +139,15 @@ def __init__(self, shape, input_var=None, **kwargs):
shape : `tuple` of `int`
The shape of the input layer the first element is the batch size
and can be set to None.
input_var : `Theano shared Variables`, optional
input : `Theano shared Variables`, optional
The input data of the network, used to train the model
"""
super(InputLayer, self).__init__(shape, **kwargs)
self.input = input_var
super(InputLayer, self).__init__(input_shape, **kwargs)
self.input = input

def get_output(self, **kwargs):
return self.input

def to_json(self):
json = dict({'class': self.__class__.__name__}, **super(InputLayer, self).to_json())
return json


class ReshapeLayer(Layer):
"""
Expand Down Expand Up @@ -199,6 +200,7 @@ class DenseLayer(Layer):
def __init__(self, incoming, nb_units, W=glorot_uniform, b=constant,
activation=tanh, l1=None, l2=None, **kwargs):
super(DenseLayer, self).__init__(incoming, **kwargs)
self.nb_units = nb_units
self.shape = (self.input_shape[1], nb_units)
if isinstance(W, theano.compile.SharedVariable):
self.W = W
Expand All @@ -211,6 +213,8 @@ def __init__(self, incoming, nb_units, W=glorot_uniform, b=constant,
self.b = initializer(b, shape=(self.shape[1],), name='b')
self.params.append(self.b)
self.activation = activation
self.l1 = l1
self.l2 = l2
if l1 and l1 != 0:
self.reguls += l1 * T.mean(T.abs_(self.W))
if l2 and l2 != 0:
Expand All @@ -224,10 +228,6 @@ def get_output(self, **kwargs):
X = self.input_layer.get_output(**kwargs)
return self.activation(T.dot(X, self.W) + self.b)

def to_json(self):
json = dict({'class': self.__class__.__name__}, **super(DenseLayer, self).to_json())
return json


class UnsupervisedLayer(DenseLayer):
"""
Expand Down Expand Up @@ -283,10 +283,7 @@ def __init__(self, incoming, nb_class, W=constant, activation=softmax, **kwargs)
super(LogisticRegression, self).__init__(incoming, nb_class, W=W,
activation=activation, **kwargs)

def to_json(self):
json = dict({'class': self.__class__.__name__}, **super(LogisticRegression, self).to_json())
return json

def

class Dropout(Layer):
"""
Expand All @@ -308,9 +305,6 @@ def get_output(self, stochastic=True, **kwargs):
X = X * T_rng.binomial(self.input_shape, n=1, p=self.p, dtype=floatX)
return X

def to_json(self):
json = dict({'class': self.__class__.__name__}, **super(Dropout, self).to_json())
return json

class Dropconnect(DenseLayer):
"""
Expand Down
28 changes: 21 additions & 7 deletions yadll/model.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding: UTF-8 -*-
import cPickle

import yadll
from .layers import *
from .exceptions import *

Expand Down Expand Up @@ -294,11 +294,25 @@ def predict(self, X):
predict = theano.function(inputs=[self.x], outputs=prediction, name='predict')
return predict(X)

def to_json(self):
def to_conf(self):
return {'model name': self.name,
'file': self.file,
'network': self.network.to_json(),
'hyperparameters': self.hp.to_json(),
'update': self.updates.__name__,
'report': self.report}
'hyperparameters': self.hp.to_conf(),
'network': self.network.to_conf(),
'updates': self.updates.__name__,
'report': self.report,
'file': self.file}

def from_conf(self, conf):
_conf = conf.copy()
self.name = _conf['model name']
self.hp = yadll.hyperparameters.Hyperparameters()
for k, v in _conf['hyperparameters'].iteritems():
self.hp(k, v)
self.network = yadll.network.Network()
self.network.from_conf(_conf['network'])
self.updates = getattr(yadll.updates, _conf['updates'])
self.report = _conf['file']
self.file = _conf['file']
pass


0 comments on commit 7614c21

Please sign in to comment.