Randomness seeding, small fixes
This commit is contained in:
parent
48381f8af5
commit
15a3a1f1ce
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user