From 8b88ee1950d52f2b76ff9abce3a079ecc1b9dc77 Mon Sep 17 00:00:00 2001 From: zsdonghao Date: Tue, 17 Apr 2018 11:14:49 +0100 Subject: [PATCH 1/4] update conv1d with tf.layers --- tensorlayer/layers/convolution.py | 46 +++++++++++++++++-------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/tensorlayer/layers/convolution.py b/tensorlayer/layers/convolution.py index 162a2c22b..9c6650cf8 100644 --- a/tensorlayer/layers/convolution.py +++ b/tensorlayer/layers/convolution.py @@ -71,7 +71,8 @@ def __init__( stride=1, dilation_rate=1, padding='SAME', - data_format='NWC', + dilation_rate=1, + data_format='channels_last', #NWC', W_init=tf.truncated_normal_initializer(stddev=0.02), b_init=tf.constant_initializer(value=0.0), W_init_args=None, @@ -85,29 +86,32 @@ def __init__( if act is None: act = tf.identity - if W_init_args is None: - W_init_args = {} - if b_init_args is None: - b_init_args = {} - with tf.variable_scope(name): - W = tf.get_variable(name='W_conv1d', shape=shape, initializer=W_init, dtype=LayersConfig.tf_dtype, **W_init_args) - self.outputs = tf.nn.convolution( - self.inputs, W, strides=(stride, ), padding=padding, dilation_rate=(dilation_rate, ), data_format=data_format) # 1.2 - if b_init: - b = tf.get_variable(name='b_conv1d', shape=(shape[-1]), initializer=b_init, dtype=LayersConfig.tf_dtype, **b_init_args) - self.outputs = self.outputs + b + if tf.__version__ > '1.3': + con1d = tf.layers.Conv1D(filters=n_filter, kernel_size=filter_size, strides=strides, padding=padding, + data_format=data_format, dilation_rate=dilation_rate, activation=act, use_bias=(True if b_init else False), + kernel_initializer=W_init, bias_initializer=b_init, name=name) + else: + if W_init_args is None: + W_init_args = {} + if b_init_args is None: + b_init_args = {} - self.outputs = act(self.outputs) + with tf.variable_scope(name): + W = tf.get_variable(name='W_conv1d', shape=shape, initializer=W_init, dtype=LayersConfig.tf_dtype, **W_init_args) + self.outputs = tf.nn.convolution( + self.inputs, W, strides=(stride, ), padding=padding, dilation_rate=(dilation_rate, ), data_format=data_format) # 1.2 + if b_init: + b = tf.get_variable(name='b_conv1d', shape=(shape[-1]), initializer=b_init, dtype=LayersConfig.tf_dtype, **b_init_args) + self.outputs = self.outputs + b - # self.all_layers = list(layer.all_layers) - # self.all_params = list(layer.all_params) - # self.all_drop = dict(layer.all_drop) - self.all_layers.append(self.outputs) - if b_init: - self.all_params.extend([W, b]) - else: - self.all_params.append(W) + self.outputs = act(self.outputs) + + self.all_layers.append(self.outputs) + if b_init: + self.all_params.extend([W, b]) + else: + self.all_params.append(W) class Conv2dLayer(Layer): From dfbaddf9f93be8d9a9a41e0c5c79c26f0da6cb1e Mon Sep 17 00:00:00 2001 From: zsdonghao Date: Tue, 17 Apr 2018 12:12:12 +0100 Subject: [PATCH 2/4] update conv1d fun --> class --- docs/modules/layers.rst | 2 +- tensorlayer/layers/convolution.py | 149 ++++++++++++++++-------------- 2 files changed, 82 insertions(+), 69 deletions(-) diff --git a/docs/modules/layers.rst b/docs/modules/layers.rst index 81e43c607..7e78ba415 100644 --- a/docs/modules/layers.rst +++ b/docs/modules/layers.rst @@ -484,7 +484,7 @@ APIs may better for you. 1D Convolution ^^^^^^^^^^^^^^^^^^^^^^^ -.. autofunction:: Conv1d +.. autoclass:: Conv1d 2D Convolution ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tensorlayer/layers/convolution.py b/tensorlayer/layers/convolution.py index 9c6650cf8..ccf25893e 100644 --- a/tensorlayer/layers/convolution.py +++ b/tensorlayer/layers/convolution.py @@ -71,8 +71,7 @@ def __init__( stride=1, dilation_rate=1, padding='SAME', - dilation_rate=1, - data_format='channels_last', #NWC', + data_format='NWC', W_init=tf.truncated_normal_initializer(stddev=0.02), b_init=tf.constant_initializer(value=0.0), W_init_args=None, @@ -87,31 +86,25 @@ def __init__( if act is None: act = tf.identity - if tf.__version__ > '1.3': - con1d = tf.layers.Conv1D(filters=n_filter, kernel_size=filter_size, strides=strides, padding=padding, - data_format=data_format, dilation_rate=dilation_rate, activation=act, use_bias=(True if b_init else False), - kernel_initializer=W_init, bias_initializer=b_init, name=name) - else: - if W_init_args is None: - W_init_args = {} - if b_init_args is None: - b_init_args = {} + if W_init_args is None: + W_init_args = {} + if b_init_args is None: + b_init_args = {} - with tf.variable_scope(name): - W = tf.get_variable(name='W_conv1d', shape=shape, initializer=W_init, dtype=LayersConfig.tf_dtype, **W_init_args) - self.outputs = tf.nn.convolution( - self.inputs, W, strides=(stride, ), padding=padding, dilation_rate=(dilation_rate, ), data_format=data_format) # 1.2 - if b_init: - b = tf.get_variable(name='b_conv1d', shape=(shape[-1]), initializer=b_init, dtype=LayersConfig.tf_dtype, **b_init_args) - self.outputs = self.outputs + b + with tf.variable_scope(name): + W = tf.get_variable(name='W_conv1d', shape=shape, initializer=W_init, dtype=LayersConfig.tf_dtype, **W_init_args) + self.outputs = tf.nn.convolution(self.inputs, W, strides=(stride, ), padding=padding, dilation_rate=(dilation_rate, )) # 1.2 + if b_init: + b = tf.get_variable(name='b_conv1d', shape=(shape[-1]), initializer=b_init, dtype=LayersConfig.tf_dtype, **b_init_args) + self.outputs = self.outputs + b - self.outputs = act(self.outputs) + self.outputs = act(self.outputs) - self.all_layers.append(self.outputs) - if b_init: - self.all_params.extend([W, b]) - else: - self.all_params.append(W) + self.all_layers.append(self.outputs) + if b_init: + self.all_params.extend([W, b]) + else: + self.all_params.append(W) class Conv2dLayer(Layer): @@ -1265,21 +1258,7 @@ def deconv2d_bilinear_upsampling_initializer(shape): @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release -def conv1d( - prev_layer, - n_filter=32, - filter_size=5, - stride=1, - dilation_rate=1, - act=tf.identity, - padding='SAME', - data_format="NWC", - W_init=tf.truncated_normal_initializer(stddev=0.02), - b_init=tf.constant_initializer(value=0.0), - W_init_args=None, - b_init_args=None, - name='conv1d', -): +class Conv1d(Layer): """Simplified version of :class:`Conv1dLayer`. Parameters @@ -1305,17 +1284,12 @@ def conv1d( b_init : initializer or None The initializer for the bias vector. If None, skip biases. W_init_args : dictionary - The arguments for the weight matrix initializer. + The arguments for the weight matrix initializer (deprecated). b_init_args : dictionary - The arguments for the bias vector initializer. + The arguments for the bias vector initializer (deprecated). name : str A unique layer name - Returns - ------- - :class:`Layer` - A :class:`Conv1dLayer` object. - Examples --------- >>> x = tf.placeholder(tf.float32, (batch_size, width)) @@ -1335,25 +1309,67 @@ def conv1d( """ - if W_init_args is None: - W_init_args = {} - if b_init_args is None: - b_init_args = {} + # @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release + def __init__(self, + prev_layer, + n_filter=32, + filter_size=5, + stride=1, + dilation_rate=1, + act=tf.identity, + padding='SAME', + data_format="channels_last", + W_init=tf.truncated_normal_initializer(stddev=0.02), + b_init=tf.constant_initializer(value=0.0), + W_init_args=None, + b_init_args=None, + name='conv1d'): - return Conv1dLayer( - prev_layer=prev_layer, - act=act, - shape=(filter_size, int(prev_layer.outputs.get_shape()[-1]), n_filter), - stride=stride, - dilation_rate=dilation_rate, - padding=padding, - data_format=data_format, - W_init=W_init, - b_init=b_init, - W_init_args=W_init_args, - b_init_args=b_init_args, - name=name, - ) + super().__init__(prev_layer=prev_layer, name=name) + logging.info("Conv1d %s: n_filter:%d filter_size:%s stride:%d pad:%s act:%s dilation_rate:%d" % (name, n_filter, filter_size, stride, padding, + act.__name__, dilation_rate)) + + self.inputs = prev_layer.outputs + if tf.__version__ > '1.3': + con1d = tf.layers.Conv1D( + filters=n_filter, + kernel_size=filter_size, + strides=stride, + padding=padding, + data_format=data_format, + dilation_rate=dilation_rate, + activation=act, + use_bias=(True if b_init else False), + kernel_initializer=W_init, + bias_initializer=b_init, + name=name) + # con1d.dtype = LayersConfig.tf_dtype # unsupport, it will use the same dtype of inputs + self.outputs = con1d(self.inputs) + new_variables = con1d.weights # new_variables = tf.get_collection(TF_GRAPHKEYS_VARIABLES, scope=vs.name) + self.all_layers.append(self.outputs) + self.all_params.extend(new_variables) + else: + raise RuntimeError("please update TF > 1.3 or downgrade TL < 1.8.4") + # if W_init_args is None: + # W_init_args = {} + # if b_init_args is None: + # b_init_args = {} + # data_format='HWC' + # return Conv1dLayer( + + # prev_layer=prev_layer, + # act=act, + # shape=(filter_size, int(prev_layer.outputs.get_shape()[-1]), n_filter), + # stride=stride, + # dilation_rate=dilation_rate, + # padding=padding, + # data_format=data_format, + # W_init=W_init, + # b_init=b_init, + # W_init_args=W_init_args, + # b_init_args=b_init_args, + # name=name, + # ) # TODO: DeConv1d @@ -1696,9 +1712,6 @@ def __init__(self, ) new_variables = tf.get_collection(TF_GRAPHKEYS_VARIABLES, scope=vs.name) - # self.all_layers = list(layer.all_layers) - # self.all_params = list(layer.all_params) - # self.all_drop = dict(layer.all_drop) self.all_layers.append(self.outputs) self.all_params.extend(new_variables) @@ -2024,6 +2037,6 @@ def __init__( # Alias AtrousConv1dLayer = atrous_conv1d -Conv1d = conv1d +# Conv1d = conv1d # Conv2d = conv2d DeConv2d = deconv2d From 1907ebf2feb9230a5ed7c3350644ac32fd8d74b7 Mon Sep 17 00:00:00 2001 From: zsdonghao Date: Tue, 17 Apr 2018 12:13:20 +0100 Subject: [PATCH 3/4] yapf --- tensorlayer/layers/convolution.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tensorlayer/layers/convolution.py b/tensorlayer/layers/convolution.py index ccf25893e..a6db7e27d 100644 --- a/tensorlayer/layers/convolution.py +++ b/tensorlayer/layers/convolution.py @@ -1257,7 +1257,6 @@ def deconv2d_bilinear_upsampling_initializer(shape): return bilinear_weights_init -@deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release class Conv1d(Layer): """Simplified version of :class:`Conv1dLayer`. @@ -1309,7 +1308,7 @@ class Conv1d(Layer): """ - # @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release + @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, n_filter=32, From 6861a61a66c1eac05c41ff3e9a3c931ada43dffc Mon Sep 17 00:00:00 2001 From: zsdonghao Date: Tue, 17 Apr 2018 13:10:07 +0100 Subject: [PATCH 4/4] fix super --- tensorlayer/layers/convolution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorlayer/layers/convolution.py b/tensorlayer/layers/convolution.py index a6db7e27d..eec550d87 100644 --- a/tensorlayer/layers/convolution.py +++ b/tensorlayer/layers/convolution.py @@ -1324,7 +1324,7 @@ def __init__(self, b_init_args=None, name='conv1d'): - super().__init__(prev_layer=prev_layer, name=name) + super(Conv1d, self).__init__(prev_layer=prev_layer, name=name) logging.info("Conv1d %s: n_filter:%d filter_size:%s stride:%d pad:%s act:%s dilation_rate:%d" % (name, n_filter, filter_size, stride, padding, act.__name__, dilation_rate))