def get_dummy_recurrent_transform(recurrent_transform_name, n_out=5, n_batches=2, n_input_t=2, n_input_dim=2): """ :type recurrent_transform_name: str :rtype: RecurrentTransformBase This function is a useful helper for testing/debugging. """ cls = transform_classes[recurrent_transform_name] from NetworkRecurrentLayer import RecurrentUnitLayer from NetworkBaseLayer import SourceLayer if getattr(RecurrentUnitLayer, "rng", None) is None: RecurrentUnitLayer.initialize_rng() index = theano.shared(numpy.array([[1] * n_batches] * n_input_t, dtype="int8"), name="i") x_out = theano.shared(numpy.array([[[1.0] * n_input_dim] * n_batches] * n_input_t, dtype="float32"), name="x") layer = RecurrentUnitLayer(n_out=n_out, index=index, sources=[], base=[ SourceLayer( n_out=x_out.get_value().shape[2], x_out=x_out, index=index) ], attention=recurrent_transform_name) assert isinstance(layer.recurrent_transform, cls) return layer.recurrent_transform
def traverse(content, layer_name, target, output_index, inherit=False): if layer_name in network.hidden: return network.hidden[layer_name].index if layer_name in network.output: return network.output[layer_name].index source = [] obj = content[layer_name].copy() if 'inherit' in obj: if not obj['inherit'] in templates: traverse(content, obj['inherit'], target, output_index, True) template = templates[obj['inherit']].copy() for key in template.keys(): if not key in obj.keys(): obj[key] = template[key] del obj['inherit'] templates[layer_name] = obj.copy() if inherit: return output_index cl = obj.pop('class', None) index = output_index if 'target' in obj: target = obj['target'] dtype = obj.get("dtype", "int32") network.use_target(target, dtype=dtype) if not 'from' in obj and cl is not None: source = [ SourceLayer(network.n_in, network.x, sparse=sparse_input, name='data', index=network.i) ] index = network.i elif 'from' in obj and obj['from']: if not isinstance(obj['from'], list): obj['from'] = [obj['from']] for prev in obj['from']: if prev == 'data': source.append( SourceLayer(network.n_in, network.x, sparse=sparse_input, name='data', index=network.i)) index = network.i elif not prev in content.keys() and prev != "null": sparse = obj.pop('sparse_input', False) dtype = 'int32' if sparse else 'float32' source.append( SourceLayer(0, None, sparse=sparse, dtype=dtype, name='data', network=network, data_key=prev)) index = source[-1].index elif prev != "null": index = traverse(content, prev, target, index) source.append(network.get_layer(prev)) if 'encoder' in obj: encoder = [] if not isinstance(obj['encoder'], list): obj['encoder'] = [obj['encoder']] for prev in obj['encoder']: traverse(content, prev, target, index) encoder.append(network.get_layer(prev)) obj['encoder'] = encoder if 'base' in obj: # TODO(doetsch) string/layer transform should be smarter base = [] if not isinstance(obj['base'], list): if ',' in obj['base']: obj['base'] = obj['base'].split(',') else: obj['base'] = [obj['base']] for prev in obj['base']: if prev == 'data': base.append( SourceLayer(network.n_in, network.x, sparse=sparse_input, name='data', index=network.i)) else: traverse(content, prev, target, index) base.append(network.get_layer(prev)) obj['base'] = base for key in ['copy_input', 'copy_output', 'aligner']: if key in obj: index = traverse(content, obj[key], target, index) obj[key] = network.get_layer(obj[key]) if 'encoder' in obj and not source: index = output_index if 'target' in obj and obj['target'] != "null": index = network.j[obj['target']] obj.pop('from', None) params = { 'sources': source, 'dropout': 0.0, 'name': layer_name, "train_flag": train_flag, "eval_flag": eval_flag, 'network': network } params.update(obj) params["mask"] = mask # overwrite params['index'] = index params['y_in'] = network.y if cl: templates[layer_name]['class'] = cl if cl == 'softmax' or cl == 'decoder': if not 'target' in params: params['target'] = target if 'loss' in obj and obj['loss'] in ('ctc', 'hmm'): params['index'] = network.i elif target != "null": params['index'] = network.j[target] #output_index return network.make_classifier(**params) elif cl is not None: layer_class = get_layer_class(cl) params.update({'name': layer_name}) if layer_class.recurrent: network.recurrent = True return network.add_layer(layer_class(**params)).index
import theano import numpy from NetworkBaseLayer import Container, SourceLayer from NetworkRecurrentLayer import RecurrentUnitLayer Container.initialize_rng() # TODO more sane data index = theano.shared(numpy.array([[1]]), name="i") source = SourceLayer(n_out=2, x_out=theano.shared(numpy.array([[[1.0, -2.0]]], dtype='float32'), name="x", index=index)) def test_RecurrentUnitLayer_init(): RecurrentUnitLayer(n_out=3, sources=[source], index=index) def test_RecurrentUnitLayer_init_sampling2(): RecurrentUnitLayer(n_out=3, sources=[source], index=index, sampling=2)