未验证 提交 f4710cf0 编写于 作者: D dzhwinter 提交者: GitHub

"add sequence conv layer" (#5117)

* "add sequence conv layer"

* "add sequence layer"

* add networks

* "fix based comment"

* Update layers.py
上级 d3cc7ac3
...@@ -5,7 +5,7 @@ import re ...@@ -5,7 +5,7 @@ import re
__all__ = [ __all__ = [
'fc', 'data', 'cross_entropy', 'conv2d', 'pool2d', 'embedding', 'concat', 'fc', 'data', 'cross_entropy', 'conv2d', 'pool2d', 'embedding', 'concat',
'StaticRNN', 'cast', 'batch_norm' 'StaticRNN', 'cast', 'sequence_conv', 'sequence_pool'
] ]
...@@ -165,6 +165,18 @@ _create_op_func_('dropout') ...@@ -165,6 +165,18 @@ _create_op_func_('dropout')
_create_op_func_('reshape') _create_op_func_('reshape')
def cast(x, data_type, program=None):
helper = LayerHelper('cast', **locals())
out = helper.create_tmp_variable(dtype=data_type)
helper.append_op(
type='cast',
inputs={'X': [x]},
outputs={'Out': [out]},
attrs={'in_data_type': x.data_type,
'out_data_type': out.data_type})
return out
def cast(x, data_type, program=None): def cast(x, data_type, program=None):
helper = LayerHelper('cast', **locals()) helper = LayerHelper('cast', **locals())
out = helper.create_tmp_variable(dtype=data_type) out = helper.create_tmp_variable(dtype=data_type)
...@@ -220,6 +232,46 @@ def square_error_cost(input, label, **kwargs): ...@@ -220,6 +232,46 @@ def square_error_cost(input, label, **kwargs):
return square_out return square_out
def sequence_conv(input,
num_filters,
name=None,
filter_size=3,
act=None,
stride=1,
padding=None,
bias_attr=None,
param_attr=None,
program=None,
init_program=None):
# FIXME(dzh) : want to unify the argument of python layer
# function. So we ignore some unecessary attributes.
# such as, padding_trainable, context_start.
helper = LayerHelper('sequence_conv', **locals())
dtype = helper.input_dtype()
filter_shape = [num_filters, filter_size]
filter = helper.create_parameter(
attr=helper.param_attr, shape=filter_shape, dtype=dtype)
pre_bias = helper.create_tmp_variable(dtype)
helper.append_op(
type='sequence_conv',
inputs={
'X': [input],
'Filter': filter,
},
outputs={"Out": pre_bias},
attrs={
'context_stride': stride,
'context_start': 0,
'context_length': filter_size
})
pre_act = helper.append_bias_op(pre_bias)
return helper.append_activation(pre_act)
def conv2d(input, def conv2d(input,
num_filters, num_filters,
name=None, name=None,
...@@ -272,6 +324,35 @@ def conv2d(input, ...@@ -272,6 +324,35 @@ def conv2d(input,
return helper.append_activation(pre_act) return helper.append_activation(pre_act)
def sequence_pool(input,
pool_size,
pool_type,
pool_stride=1,
pool_padding=0,
global_pooling=False,
program=None,
init_program=None):
# FIXME(dzh) : want to unify the argument of python layer
# function. So we ignore some unecessary attributes
ENUM_POOL_TYPE = set(["max", "avg", "sqrt", "last", "first"])
if pool_type not in ENUM_POOL_TYPE:
raise ValueError("Unknown pool_type: '%s'. It can only be %s.",
str(pool_type), " ".join(ENUM_POOL_TYPE))
helper = LayerHelper('sequence_pool', **locals())
dtype = helper.input_dtype()
pool_out = helper.create_tmp_variable(dtype)
helper.append_op(
type="sequence_pool",
inputs={"X": [input]},
outputs={"Out": pool_out},
attrs={"strategy": pool_type})
return pool_out
def pool2d(input, def pool2d(input,
pool_size, pool_size,
pool_type, pool_type,
...@@ -291,7 +372,7 @@ def pool2d(input, ...@@ -291,7 +372,7 @@ def pool2d(input,
if isinstance(pool_padding, int): if isinstance(pool_padding, int):
pool_padding = [pool_padding, pool_padding] pool_padding = [pool_padding, pool_padding]
helper = LayerHelper('conv2d', **locals()) helper = LayerHelper('pool2d', **locals())
dtype = helper.input_dtype() dtype = helper.input_dtype()
pool_out = helper.create_tmp_variable(dtype) pool_out = helper.create_tmp_variable(dtype)
......
import paddle.v2.framework.layers as layers import paddle.v2.framework.layers as layers
__all__ = ["simple_img_conv_pool", "sequence_conv_pool"]
def simple_img_conv_pool(input, def simple_img_conv_pool(input,
filter_size,
num_filters, num_filters,
filter_size,
pool_size, pool_size,
pool_stride, pool_stride,
act, act,
...@@ -94,3 +96,29 @@ def img_conv_group(input, ...@@ -94,3 +96,29 @@ def img_conv_group(input,
program=program, program=program,
init_program=init_program) init_program=init_program)
return pool_out return pool_out
def sequence_conv_pool(input,
num_filters,
filter_size,
pool_size,
pool_stride,
act,
program=None,
init_program=None):
conv_out = layers.sequence_conv(
input=input,
num_filters=num_filters,
filter_size=filter_size,
act=act,
program=program,
init_program=init_program)
pool_out = layers.sequence_pool(
input=conv_out,
pool_size=pool_size,
pool_type='max',
pool_stride=pool_stride,
program=program,
init_program=init_program)
return pool_out
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册