Randomness seeding, small fixes

This commit is contained in:
fchollet 2015-07-31 10:38:46 +09:00
parent 48381f8af5
commit 15a3a1f1ce
5 changed files with 28 additions and 35 deletions

@ -12,7 +12,6 @@ from ..regularizers import ActivityRegularizer, Regularizer
from theano.sandbox.rng_mrg import MRG_RandomStreams as RandomStreams
from six.moves import zip
srng = RandomStreams(seed=np.random.randint(10e6))
class Layer(object):
@ -223,13 +222,14 @@ class Dropout(MaskedLayer):
def __init__(self, p):
super(Dropout, self).__init__()
self.p = p
self.srng = RandomStreams(seed=np.random.randint(10e6))
def get_output(self, train=False):
X = self.get_input(train)
if self.p > 0.:
retain_prob = 1. - self.p
if train:
X *= srng.binomial(X.shape, p=retain_prob, dtype=theano.config.floatX)
X *= self.srng.binomial(X.shape, p=retain_prob, dtype=theano.config.floatX)
else:
X *= retain_prob
return X
@ -512,11 +512,11 @@ class AutoEncoder(Layer):
self.constraints = []
for layer in [self.encoder, self.decoder]:
params, regularizers, constraints = layer.get_params()
self.constraints += constraints
for p, r in zip(params, regularizers):
self.regularizers += regularizers
for p, c in zip(params, constraints):
if p not in self.params:
self.params.append(p)
self.regularizers.append(r)
self.constraints.append(c)
if weights is not None:
self.set_weights(weights)

@ -1,7 +1,9 @@
from __future__ import absolute_import
from .core import srng, MaskedLayer
import numpy as np
from .core import MaskedLayer
import theano
import theano.tensor as T
from theano.sandbox.rng_mrg import MRG_RandomStreams as RandomStreams
class GaussianNoise(MaskedLayer):
@ -11,14 +13,15 @@ class GaussianNoise(MaskedLayer):
def __init__(self, sigma):
super(GaussianNoise, self).__init__()
self.sigma = sigma
self.srng = RandomStreams(seed=np.random.randint(10e6))
def get_output(self, train=False):
X = self.get_input(train)
if not train or self.sigma == 0:
return X
else:
return X + srng.normal(size=X.shape, avg=0.0, std=self.sigma,
dtype=theano.config.floatX)
return X + self.srng.normal(size=X.shape, avg=0.0, std=self.sigma,
dtype=theano.config.floatX)
def get_config(self):
return {"name": self.__class__.__name__,
@ -36,12 +39,13 @@ class GaussianDropout(MaskedLayer):
def __init__(self, p):
super(GaussianDropout, self).__init__()
self.p = p
self.srng = RandomStreams(seed=np.random.randint(10e6))
def get_output(self, train):
X = self.get_input(train)
if train:
# self.p refers to drop probability rather than retain probability (as in paper) to match Dropout layer syntax
X *= srng.normal(size=X.shape, avg=1.0, std=T.sqrt(self.p / (1.0 - self.p)), dtype=theano.config.floatX)
X *= self.srng.normal(size=X.shape, avg=1.0, std=T.sqrt(self.p / (1.0 - self.p)), dtype=theano.config.floatX)
return X
def get_config(self):

@ -124,7 +124,7 @@ def model_from_config(config):
class_mode = config.get('class_mode')
theano_mode = config.get('theano_mode')
optimizer_params = config.get('optimizer')
optimizer_params = dict([(k, v) for k, v in config.get('optimizer').items()])
optimizer_name = optimizer_params.pop('name')
optimizer = optimizers.get(optimizer_name, optimizer_params)
@ -213,9 +213,9 @@ class Model(object):
callbacks.on_batch_end(batch_index, batch_logs)
epoch_logs = {}
if batch_index == len(batches) - 1: # last batch
# validation
epoch_logs = {}
if do_validation:
# replace with self._evaluate
val_outs = self._test_loop(val_f, val_ins, batch_size=batch_size, verbose=0)

@ -2,6 +2,7 @@ from __future__ import print_function
import inspect
import numpy as np
import theano
import copy
from ..layers.advanced_activations import LeakyReLU, PReLU
from ..layers.core import Dense, Merge, Dropout, Activation, Reshape, Flatten, RepeatVector, Layer
@ -15,9 +16,9 @@ from .. import regularizers
from .. import constraints
def container_from_config(layer_dict):
def container_from_config(original_layer_dict):
layer_dict = copy.deepcopy(original_layer_dict)
name = layer_dict.get('name')
hasParams = False
if name == 'Merge':
mode = layer_dict.get('mode')
@ -57,12 +58,7 @@ def container_from_config(layer_dict):
return graph_layer
else:
# The case in which layer_dict represents an "atomic" layer
layer_dict.pop('name')
if 'parameters' in layer_dict:
params = layer_dict.get('parameters')
layer_dict.pop('parameters')
hasParams = True
for k, v in layer_dict.items():
# For now, this can only happen for regularizers and constraints
@ -75,13 +71,6 @@ def container_from_config(layer_dict):
layer_dict[k] = regularizers.get(vname, v)
base_layer = get_layer(name, layer_dict)
if hasParams:
shaped_params = []
for param in params:
data = np.asarray(param.get('data'))
shape = tuple(param.get('shape'))
shaped_params.append(data.reshape(shape))
base_layer.set_weights(shaped_params)
return base_layer

@ -14,12 +14,12 @@ from keras.datasets import imdb
from keras.models import model_from_yaml
'''
This is essentially the IMDB test. Deserialized models should yield
This is essentially the IMDB test. Deserialized models should yield
the same config as the original one.
'''
max_features = 10000
maxlen = 100
maxlen = 100
batch_size = 32
(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features, test_split=0.2)
@ -29,7 +29,7 @@ X_test = sequence.pad_sequences(X_test, maxlen=maxlen)
model = Sequential()
model.add(Embedding(max_features, 128))
model.add(LSTM(128, 128))
model.add(LSTM(128, 128))
model.add(Dropout(0.5))
model.add(Dense(128, 1, W_regularizer='identity', b_constraint='maxnorm'))
model.add(Activation('sigmoid'))
@ -70,7 +70,7 @@ y = np.random.random((100, 4))
y2 = np.random.random((100,))
(X_train, y_train), (X_test, y_test) = get_test_data(nb_train=1000, nb_test=200, input_shape=(32,),
classification=False, output_shape=(4,))
classification=False, output_shape=(4,))
graph = Graph()
@ -81,12 +81,12 @@ graph.add_node(Dense(32, 4), name='dense2', input='input1')
graph.add_node(Dense(16, 4), name='dense3', input='dense1')
graph.add_output(name='output1', inputs=['dense2', 'dense3'], merge_mode='sum')
graph.compile('rmsprop', {'output1':'mse'})
graph.compile('rmsprop', {'output1': 'mse'})
graph.get_config(verbose=1)
history = graph.fit({'input1':X_train, 'output1':y_train}, nb_epoch=10)
original_pred = graph.predict({'input1':X_test})
history = graph.fit({'input1': X_train, 'output1': y_train}, nb_epoch=10)
original_pred = graph.predict({'input1': X_test})
graph_yaml = graph.to_yaml()
graph.save_weights('temp.h5', overwrite=True)
@ -95,7 +95,7 @@ reloaded_graph = model_from_yaml(graph_yaml)
reloaded_graph.load_weights('temp.h5')
reloaded_graph.get_config(verbose=1)
reloaded_graph.compile('rmsprop', {'output1':'mse'})
new_pred = reloaded_graph.predict({'input1':X_test})
reloaded_graph.compile('rmsprop', {'output1': 'mse'})
new_pred = reloaded_graph.predict({'input1': X_test})
assert(new_pred['output1'][3][1] == original_pred['output1'][3][1])
assert(np.sum(new_pred['output1'] - original_pred['output1']) == 0)