diff --git a/docs/modules/layers.rst b/docs/modules/layers.rst index 7e03e4d08..4718bc670 100644 --- a/docs/modules/layers.rst +++ b/docs/modules/layers.rst @@ -571,19 +571,19 @@ Pooling layer for any dimensions and any pooling functions. 1D Max pooling ^^^^^^^^^^^^^^^^^^^ -.. autofunction:: MaxPool1d +.. autoclass:: MaxPool1d 1D Mean pooling ^^^^^^^^^^^^^^^^^^^ -.. autofunction:: MeanPool1d +.. autoclass:: MeanPool1d 2D Max pooling ^^^^^^^^^^^^^^^^^^^ -.. autofunction:: MaxPool2d +.. autoclass:: MaxPool2d 2D Mean pooling ^^^^^^^^^^^^^^^^^^^ -.. autofunction:: MeanPool2d +.. autoclass:: MeanPool2d 3D Max pooling ^^^^^^^^^^^^^^^^^^^ diff --git a/tensorlayer/layers/pooling.py b/tensorlayer/layers/pooling.py index 5bd5989dd..6ad2eb842 100644 --- a/tensorlayer/layers/pooling.py +++ b/tensorlayer/layers/pooling.py @@ -70,13 +70,13 @@ def __init__( logging.info("PoolLayer %s: ksize:%s strides:%s padding:%s pool:%s" % (name, str(ksize), str(strides), padding, pool.__name__)) self.inputs = prev_layer.outputs - + # operation (customized) self.outputs = pool(self.inputs, ksize=ksize, strides=strides, padding=padding, name=name) + # update layer (customized) self.all_layers.append(self.outputs) -@deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release -def maxpool1d(prev_layer, filter_size=3, strides=2, padding='valid', data_format='channels_last', name=None): +class MaxPool1d(Layer): """Max pooling for 1D signal [batch, length, channel]. Wrapper for `tf.layers.max_pooling1d `__ . Parameters @@ -97,23 +97,20 @@ def maxpool1d(prev_layer, filter_size=3, strides=2, padding='valid', data_format name : str A unique layer name. - Returns - ------- - :class:`Layer` - A max pooling 1-D layer with a output rank as 3. - """ - logging.info("MaxPool1d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) - outputs = tf.layers.max_pooling1d(prev_layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name) - net_new = copy.copy(prev_layer) - net_new.outputs = outputs - net_new.all_layers.extend([outputs]) - return net_new + @deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release + def __init__(self, prev_layer, filter_size=3, strides=2, padding='valid', data_format='channels_last', name='maxpool1d'): + super(MaxPool1d, self).__init__(prev_layer=prev_layer, name=name) + logging.info("MaxPool1d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) + self.inputs = prev_layer.outputs + # operation (customized) + self.outputs = tf.layers.max_pooling1d(self.inputs, filter_size, strides, padding=padding, data_format=data_format, name=name) + # update layer (customized) + self.all_layers.append(self.outputs) -@deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release -def meanpool1d(prev_layer, filter_size=3, strides=2, padding='valid', data_format='channels_last', name=None): +class MeanPool1d(Layer): """Mean pooling for 1D signal [batch, length, channel]. Wrapper for `tf.layers.average_pooling1d `__ . Parameters @@ -134,24 +131,28 @@ def meanpool1d(prev_layer, filter_size=3, strides=2, padding='valid', data_forma name : str A unique layer name. - Returns - ------- - :class:`Layer` - A mean pooling 1-D layer with a output rank as 3. - """ - logging.info("MeanPool1d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) - outputs = tf.layers.average_pooling1d(prev_layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name) + # logging.info("MeanPool1d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) + # outputs = tf.layers.average_pooling1d(prev_layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name) + # + # net_new = copy.copy(prev_layer) + # net_new.outputs = outputs + # net_new.all_layers.extend([outputs]) + # return net_new + @deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release + def __init__(self, prev_layer, filter_size=3, strides=2, padding='valid', data_format='channels_last', name='meanpool1d'): + super(MeanPool1d, self).__init__(prev_layer=prev_layer, name=name) + logging.info("MeanPool1d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) - net_new = copy.copy(prev_layer) - net_new.outputs = outputs - net_new.all_layers.extend([outputs]) - return net_new + # operation (customized) + self.outputs = tf.layers.average_pooling1d(prev_layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name) + + # update layer (customized) + self.all_layers.append(self.outputs) -@deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release -def maxpool2d(prev_layer, filter_size=(3, 3), strides=(2, 2), padding='SAME', name='maxpool'): - """Max pooling for 2D image [batch, height, width, channel]. Wrapper for :class:`PoolLayer`. +class MaxPool2d(Layer): + """Max pooling for 2D image [batch, height, width, channel]. Parameters ----------- @@ -166,33 +167,31 @@ def maxpool2d(prev_layer, filter_size=(3, 3), strides=(2, 2), padding='SAME', na name : str A unique layer name. - Returns - ------- - :class:`Layer` - A max pooling 2-D layer with a output rank as 4. - """ - if strides is None: - strides = filter_size - if tf.__version__ > '1.5': - outputs = tf.layers.max_pooling2d(prev_layer.outputs, filter_size, strides, padding=padding, data_format='channels_last', name=name) - net_new = copy.copy(prev_layer) - net_new.outputs = outputs - net_new.all_layers.extend([outputs]) - return net_new - else: - assert len(strides) == 2, "len(strides) should be 2, MaxPool2d and PoolLayer are different." + @deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release + def __init__(self, prev_layer, filter_size=(3, 3), strides=(2, 2), padding='SAME', name='maxpool2d'): + if strides is None: + strides = filter_size - prev_layer = PoolLayer( - prev_layer, ksize=[1, filter_size[0], filter_size[1], 1], strides=[1, strides[0], strides[1], 1], padding=padding, pool=tf.nn.max_pool, name=name) - - return prev_layer + super(MaxPool2d, self).__init__(prev_layer=prev_layer, name=name) + logging.info("MaxPool2d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) + self.inputs = prev_layer.outputs + # operation (customized) + if tf.__version__ > '1.5': + self.outputs = tf.layers.max_pooling2d(self.inputs, filter_size, strides, padding=padding, data_format='channels_last', name=name) + else: + if len(strides) == 2: + raise Exception("len(strides) should be 2.") + ksize = [1, filter_size[0], filter_size[1], 1] + strides = [1, strides[0], strides[1], 1] + self.outputs = tf.nn.max_pool(self.inputs, ksize=ksize, strides=strides, padding=padding, name=name) + # update layer (customized) + self.all_layers.append(self.outputs) -@deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release -def meanpool2d(prev_layer, filter_size=(3, 3), strides=(2, 2), padding='SAME', name='meanpool'): - """Mean pooling for 2D image [batch, height, width, channel]. Wrapper for :class:`PoolLayer`. +class MeanPool2d(Layer): + """Mean pooling for 2D image [batch, height, width, channel]. Parameters ----------- @@ -207,27 +206,27 @@ def meanpool2d(prev_layer, filter_size=(3, 3), strides=(2, 2), padding='SAME', n name : str A unique layer name. - Returns - ------- - :class:`Layer` - A mean pooling 2-D layer with a output rank as 4. - """ - if strides is None: - strides = filter_size - if tf.__version__ > '1.5': - outputs = tf.layers.average_pooling2d(prev_layer.outputs, filter_size, strides, padding=padding, data_format='channels_last', name=name) - net_new = copy.copy(prev_layer) - net_new.outputs = outputs - net_new.all_layers.extend([outputs]) - return net_new - else: - assert len(strides) == 2, "len(strides) should be 2, MeanPool2d and PoolLayer are different." + @deprecated_alias(net='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release + def __init__(self, prev_layer, filter_size=(3, 3), strides=(2, 2), padding='SAME', name='meanpool2d'): + if strides is None: + strides = filter_size - prev_layer = PoolLayer( - prev_layer, ksize=[1, filter_size[0], filter_size[1], 1], strides=[1, strides[0], strides[1], 1], padding=padding, pool=tf.nn.avg_pool, name=name) - return prev_layer + super(MeanPool2d, self).__init__(prev_layer=prev_layer, name=name) + logging.info("MeanPool2d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) + self.inputs = prev_layer.outputs + # operation (customized) + if tf.__version__ > '1.5': + self.outputs = tf.layers.average_pooling2d(self.inputs, filter_size, strides, padding=padding, data_format='channels_last', name=name) + else: + if len(strides) == 2: + raise Exception("len(strides) should be 2.") + ksize = [1, filter_size[0], filter_size[1], 1] + strides = [1, strides[0], strides[1], 1] + self.outputs = tf.nn.avg_pool(self.inputs, ksize=ksize, strides=strides, padding=padding, name=name) + # update layer (customized) + self.all_layers.append(self.outputs) # def maxpool3d(net, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='maxpool3d'): @@ -261,13 +260,11 @@ class MaxPool3d(Layer): @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='maxpool3d'): - super(MaxPool3d, self).__init__(prev_layer=prev_layer, name=name) logging.info("MaxPool3d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding))) - + # operation (customized) self.inputs = prev_layer.outputs - - self.outputs = tf.layers.max_pooling3d(prev_layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name) + self.outputs = tf.layers.max_pooling3d(self.inputs, filter_size, strides, padding=padding, data_format=data_format, name=name) # update layer (customized) self.all_layers.append(self.outputs) @@ -338,12 +335,9 @@ class GlobalMaxPool1d(Layer): def __init__(self, prev_layer, name='globalmaxpool1d'): super(GlobalMaxPool1d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMaxPool1d %s" % name) - self.inputs = prev_layer.outputs - # operation (customized) - self.outputs = tf.reduce_max(prev_layer.outputs, axis=1, name=name) - + self.outputs = tf.reduce_max(self.inputs, axis=1, name=name) # update layer (customized) self.all_layers.append(self.outputs) @@ -370,12 +364,9 @@ class GlobalMeanPool1d(Layer): def __init__(self, prev_layer, name='globalmeanpool1d'): super(GlobalMeanPool1d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMeanPool1d %s" % name) - self.inputs = prev_layer.outputs - # operation (customized) - self.outputs = tf.reduce_mean(prev_layer.outputs, axis=1, name=name) - + self.outputs = tf.reduce_mean(self.inputs, axis=1, name=name) # update layer (customized) self.all_layers.append(self.outputs) @@ -402,12 +393,9 @@ class GlobalMaxPool2d(Layer): def __init__(self, prev_layer, name='globalmaxpool2d'): super(GlobalMaxPool2d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMaxPool2d %s" % name) - self.inputs = prev_layer.outputs - # operation (customized) - self.outputs = tf.reduce_max(prev_layer.outputs, axis=[1, 2], name=name) - + self.outputs = tf.reduce_max(self.inputs, axis=[1, 2], name=name) # update layer (customized) self.all_layers.append(self.outputs) @@ -434,12 +422,9 @@ class GlobalMeanPool2d(Layer): def __init__(self, prev_layer, name='globalmeanpool2d'): super(GlobalMeanPool2d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMeanPool2d %s" % name) - self.inputs = prev_layer.outputs - # operation (customized) - self.outputs = tf.reduce_mean(prev_layer.outputs, axis=[1, 2], name=name) - + self.outputs = tf.reduce_mean(self.inputs, axis=[1, 2], name=name) # update layer (customized) self.all_layers.append(self.outputs) @@ -465,15 +450,11 @@ class GlobalMaxPool3d(Layer): @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, name='globalmaxpool3d'): super(GlobalMaxPool3d, self).__init__(prev_layer=prev_layer, name=name) - self.inputs = prev_layer.outputs - # print out info (customized) logging.info("GlobalMaxPool3d %s" % name) - # operation (customized) - self.outputs = tf.reduce_max(prev_layer.outputs, axis=[1, 2, 3], name=name) - + self.outputs = tf.reduce_max(self.inputs, axis=[1, 2, 3], name=name) # update layer (customized) self.all_layers.append(self.outputs) @@ -500,18 +481,15 @@ class GlobalMeanPool3d(Layer): def __init__(self, prev_layer, name='globalmeanpool3d'): super(GlobalMeanPool3d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMeanPool3d %s" % name) - self.inputs = prev_layer.outputs - # operation (customized) - self.outputs = tf.reduce_mean(prev_layer.outputs, axis=[1, 2, 3], name=name) - + self.outputs = tf.reduce_mean(self.inputs, axis=[1, 2, 3], name=name) # update layer (customized) self.all_layers.append(self.outputs) # Alias -MaxPool1d = maxpool1d -MaxPool2d = maxpool2d -MeanPool1d = meanpool1d -MeanPool2d = meanpool2d +# MaxPool1d = maxpool1d +# MaxPool2d = maxpool2d +# MeanPool1d = meanpool1d +# MeanPool2d = meanpool2d