Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 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)