|
|
@ -109,9 +109,10 @@ def parse_network(*outputs):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Layer(object):
|
|
|
|
class Layer(object):
|
|
|
|
def __init__(self, name=None, parent_layers=None):
|
|
|
|
def __init__(self, name=None, size=None, parent_layers=None):
|
|
|
|
assert isinstance(parent_layers, dict)
|
|
|
|
assert isinstance(parent_layers, dict)
|
|
|
|
self.name = name
|
|
|
|
self.name = name
|
|
|
|
|
|
|
|
self.size = size
|
|
|
|
self.__parent_layers__ = parent_layers
|
|
|
|
self.__parent_layers__ = parent_layers
|
|
|
|
|
|
|
|
|
|
|
|
def to_proto(self, context):
|
|
|
|
def to_proto(self, context):
|
|
|
@ -173,7 +174,8 @@ def __convert_to_v2__(method_name, parent_names, is_default_name=True):
|
|
|
|
other_kwargs[key] = kwargs[key]
|
|
|
|
other_kwargs[key] = kwargs[key]
|
|
|
|
|
|
|
|
|
|
|
|
name = kwargs.get('name', None)
|
|
|
|
name = kwargs.get('name', None)
|
|
|
|
super(V2LayerImpl, self).__init__(name, parent_layers)
|
|
|
|
size = kwargs.get('size', None)
|
|
|
|
|
|
|
|
super(V2LayerImpl, self).__init__(name, size, parent_layers)
|
|
|
|
self.__other_kwargs__ = other_kwargs
|
|
|
|
self.__other_kwargs__ = other_kwargs
|
|
|
|
|
|
|
|
|
|
|
|
if wrapper is not None:
|
|
|
|
if wrapper is not None:
|
|
|
@ -220,9 +222,10 @@ class WithExtraParent(Layer):
|
|
|
|
def extra_parent(self):
|
|
|
|
def extra_parent(self):
|
|
|
|
return self.__extra_parent__
|
|
|
|
return self.__extra_parent__
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, name=None, parent_layers=None):
|
|
|
|
def __init__(self, name=None, size=None, parent_layers=None):
|
|
|
|
self.__extra_parent__ = []
|
|
|
|
self.__extra_parent__ = []
|
|
|
|
super(WithExtraParent, self).__init__(name, parent_layers)
|
|
|
|
super(WithExtraParent, self).__init__(
|
|
|
|
|
|
|
|
name=name, size=size, parent_layers=parent_layers)
|
|
|
|
|
|
|
|
|
|
|
|
def append_extra_parent(self, parent):
|
|
|
|
def append_extra_parent(self, parent):
|
|
|
|
self.__extra_parent__.append(parent)
|
|
|
|
self.__extra_parent__.append(parent)
|
|
|
@ -261,7 +264,8 @@ class MemoryV2(WithExtraParent):
|
|
|
|
def __init__(self, name, size, **kwargs):
|
|
|
|
def __init__(self, name, size, **kwargs):
|
|
|
|
self.name = name
|
|
|
|
self.name = name
|
|
|
|
self.size = size
|
|
|
|
self.size = size
|
|
|
|
super(MemoryV2, self).__init__(name=name, parent_layers=dict())
|
|
|
|
super(MemoryV2, self).__init__(
|
|
|
|
|
|
|
|
name=name, size=size, parent_layers=dict())
|
|
|
|
self.__kwargs__ = kwargs
|
|
|
|
self.__kwargs__ = kwargs
|
|
|
|
self.__boot_layer_name__ = None
|
|
|
|
self.__boot_layer_name__ = None
|
|
|
|
if 'boot_layer' in kwargs:
|
|
|
|
if 'boot_layer' in kwargs:
|
|
|
@ -271,7 +275,9 @@ class MemoryV2(WithExtraParent):
|
|
|
|
st = inspect.stack()
|
|
|
|
st = inspect.stack()
|
|
|
|
for i in xrange(len(st)):
|
|
|
|
for i in xrange(len(st)):
|
|
|
|
locs = inspect.stack()[i][0].f_locals
|
|
|
|
locs = inspect.stack()[i][0].f_locals
|
|
|
|
for val in locs.viewvalues():
|
|
|
|
keys = locs.keys()
|
|
|
|
|
|
|
|
for key in keys:
|
|
|
|
|
|
|
|
val = locs[key]
|
|
|
|
if isinstance(val, RecurrentLayerInput):
|
|
|
|
if isinstance(val, RecurrentLayerInput):
|
|
|
|
begin_of_current_rnn.append(val)
|
|
|
|
begin_of_current_rnn.append(val)
|
|
|
|
|
|
|
|
|
|
|
@ -322,21 +328,15 @@ class LayerOutputV2(Layer):
|
|
|
|
return self.layer_output
|
|
|
|
return self.layer_output
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class StaticInputV2(Layer):
|
|
|
|
class StaticInputV2(object):
|
|
|
|
def __init__(self, input=None, **kwargs):
|
|
|
|
def __init__(self, input, is_seq=False, size=None):
|
|
|
|
assert input is not None
|
|
|
|
assert isinstance(input, LayerV2)
|
|
|
|
self.__kwargs__ = kwargs
|
|
|
|
self.name = input.name
|
|
|
|
super(StaticInputV2, self).__init__(
|
|
|
|
self.input = input
|
|
|
|
name=input.name, parent_layers={'input': input})
|
|
|
|
self.is_seq = is_seq
|
|
|
|
|
|
|
|
self.size = size
|
|
|
|
def context_name(self):
|
|
|
|
# TODO(qiaolongfei): add size
|
|
|
|
return self.name + "#static_input"
|
|
|
|
# assert input.size is not None or size is not None
|
|
|
|
|
|
|
|
|
|
|
|
def to_proto_impl(self, **kwargs):
|
|
|
|
|
|
|
|
args = dict()
|
|
|
|
|
|
|
|
args.update(kwargs)
|
|
|
|
|
|
|
|
args.update(self.__kwargs__)
|
|
|
|
|
|
|
|
return conf_helps.StaticInput(**args)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MixedLayerV2(Layer):
|
|
|
|
class MixedLayerV2(Layer):
|
|
|
@ -370,9 +370,8 @@ class MixedLayerV2(Layer):
|
|
|
|
other_kwargs['act'] = act
|
|
|
|
other_kwargs['act'] = act
|
|
|
|
other_kwargs['bias_attr'] = bias_attr
|
|
|
|
other_kwargs['bias_attr'] = bias_attr
|
|
|
|
other_kwargs['layer_attr'] = layer_attr
|
|
|
|
other_kwargs['layer_attr'] = layer_attr
|
|
|
|
|
|
|
|
|
|
|
|
parent_layers = {"input": self.__inputs__}
|
|
|
|
parent_layers = {"input": self.__inputs__}
|
|
|
|
super(MixedLayerV2, self).__init__(name, parent_layers)
|
|
|
|
super(MixedLayerV2, self).__init__(name, size, parent_layers)
|
|
|
|
self.__other_kwargs__ = other_kwargs
|
|
|
|
self.__other_kwargs__ = other_kwargs
|
|
|
|
|
|
|
|
|
|
|
|
def __iadd__(self, other):
|
|
|
|
def __iadd__(self, other):
|
|
|
@ -452,6 +451,12 @@ def recurrent_group(step, input, name=None):
|
|
|
|
if not isinstance(input, collections.Sequence):
|
|
|
|
if not isinstance(input, collections.Sequence):
|
|
|
|
input = [input]
|
|
|
|
input = [input]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TODO(qiaolongfei) convert StaticInput to memory according to v2 recurrent_group
|
|
|
|
|
|
|
|
for i in xrange(len(input)):
|
|
|
|
|
|
|
|
cur_input = input[i]
|
|
|
|
|
|
|
|
if isinstance(cur_input, StaticInputV2):
|
|
|
|
|
|
|
|
input[i] = cur_input.input
|
|
|
|
|
|
|
|
|
|
|
|
actual_input = [
|
|
|
|
actual_input = [
|
|
|
|
RecurrentLayerInput(
|
|
|
|
RecurrentLayerInput(
|
|
|
|
recurrent_name=name,
|
|
|
|
recurrent_name=name,
|
|
|
@ -512,7 +517,7 @@ def __layer_name_mapping_parent_names__(inname):
|
|
|
|
lambda x: x in ['input1', 'input2', 'label', 'input', 'a', 'b',
|
|
|
|
lambda x: x in ['input1', 'input2', 'label', 'input', 'a', 'b',
|
|
|
|
'expand_as',
|
|
|
|
'expand_as',
|
|
|
|
'weights', 'vectors', 'weight', 'score', 'left',
|
|
|
|
'weights', 'vectors', 'weight', 'score', 'left',
|
|
|
|
'right'],
|
|
|
|
'right', 'output_mem'],
|
|
|
|
all_args)
|
|
|
|
all_args)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|