Source code for tensorlayer.layers.pooling

#! /usr/bin/python
# -*- coding: utf-8 -*-

import tensorflow as tf

from tensorlayer.layers.core import Layer

from tensorlayer import logging

from tensorlayer.decorators import deprecated_alias

__all__ = [
    'PoolLayer',
    'MaxPool1d',
    'MeanPool1d',
    'MaxPool2d',
    'MeanPool2d',
    'MaxPool3d',
    'MeanPool3d',
    'GlobalMaxPool1d',
    'GlobalMeanPool1d',
    'GlobalMaxPool2d',
    'GlobalMeanPool2d',
    'GlobalMaxPool3d',
    'GlobalMeanPool3d',
]


[docs]class PoolLayer(Layer): """ The :class:`PoolLayer` class is a Pooling layer. You can choose ``tf.nn.max_pool`` and ``tf.nn.avg_pool`` for 2D input or ``tf.nn.max_pool3d`` and ``tf.nn.avg_pool3d`` for 3D input. Parameters ---------- prev_layer : :class:`Layer` The previous layer. ksize : tuple of int The size of the window for each dimension of the input tensor. Note that: len(ksize) >= 4. strides : tuple of int The stride of the sliding window for each dimension of the input tensor. Note that: len(strides) >= 4. padding : str The padding algorithm type: "SAME" or "VALID". pool : pooling function One of ``tf.nn.max_pool``, ``tf.nn.avg_pool``, ``tf.nn.max_pool3d`` and ``f.nn.avg_pool3d``. See `TensorFlow pooling APIs <https://www.tensorflow.org/versions/master/api_docs/python/nn.html#pooling>`__ name : str A unique layer name. Examples -------- - see :class:`Conv2dLayer`. """ @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__( self, prev_layer, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1), padding='SAME', pool=tf.nn.max_pool, name='pool_layer', ): super(PoolLayer, self).__init__(prev_layer=prev_layer, name=name) logging.info( "PoolLayer %s: ksize: %s strides: %s padding: %s pool: %s" % (self.name, str(ksize), str(strides), padding, pool.__name__) ) self.outputs = pool(self.inputs, ksize=ksize, strides=strides, padding=padding, name=name) self._add_layers(self.outputs)
[docs]class MaxPool1d(Layer): """Max pooling for 1D signal. Parameters ---------- prev_layer : :class:`Layer` The previous layer with a output rank as 3 [batch, length, channel]. filter_size : tuple of int Pooling window size. strides : tuple of int Strides of the pooling operation. padding : str The padding method: 'valid' or 'same'. data_format : str One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. """ @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" % (self.name, str(filter_size), str(strides), str(padding)) ) self.outputs = tf.layers.max_pooling1d( self.inputs, filter_size, strides, padding=padding, data_format=data_format, name=name ) self._add_layers(self.outputs)
[docs]class MeanPool1d(Layer): """Mean pooling for 1D signal. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 3. filter_size : tuple of int Pooling window size. strides : tuple of int Strides of the pooling operation. padding : str The padding method: 'valid' or 'same'. data_format : str One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. """ # logging.info("MeanPool1d %s: filter_size: %s strides: %s padding: %s" % (self.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" % (self.name, str(filter_size), str(strides), str(padding)) ) self.outputs = tf.layers.average_pooling1d( prev_layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name ) self._add_layers(self.outputs)
[docs]class MaxPool2d(Layer): """Max pooling for 2D image. Parameters ----------- prev_layer : :class:`Layer` The previous layer with a output rank as 4. filter_size : tuple of int (height, width) for filter size. strides : tuple of int (height, width) for strides. padding : str The padding method: 'valid' or 'same'. data_format : str One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. """ @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', data_format='channels_last', name='maxpool2d' ): if strides is None: strides = filter_size super(MaxPool2d, self).__init__(prev_layer=prev_layer, name=name) logging.info( "MaxPool2d %s: filter_size: %s strides: %s padding: %s" % (self.name, str(filter_size), str(strides), str(padding)) ) self.outputs = tf.layers.max_pooling2d( self.inputs, filter_size, strides, padding=padding, data_format=data_format, name=name ) self._add_layers(self.outputs)
[docs]class MeanPool2d(Layer): """Mean pooling for 2D image [batch, height, width, channel]. Parameters ----------- prev_layer : :class:`Layer` The previous layer with a output rank as 4 [batch, height, width, channel]. filter_size : tuple of int (height, width) for filter size. strides : tuple of int (height, width) for strides. padding : str The padding method: 'valid' or 'same'. data_format : str One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. """ @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', data_format='channels_last', name='meanpool2d' ): if strides is None: strides = filter_size super(MeanPool2d, self).__init__(prev_layer=prev_layer, name=name) logging.info( "MeanPool2d %s: filter_size: %s strides: %s padding: %s" % (self.name, str(filter_size), str(strides), str(padding)) ) self.outputs = tf.layers.average_pooling2d( self.inputs, filter_size, strides, padding=padding, data_format=data_format, name=name ) self._add_layers(self.outputs)
[docs]class MaxPool3d(Layer): """Max pooling for 3D volume. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 5. filter_size : tuple of int Pooling window size. strides : tuple of int Strides of the pooling operation. padding : str The padding method: 'valid' or 'same'. data_format : str One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Returns ------- :class:`Layer` A max pooling 3-D layer with a output rank as 5. """ @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" % (self.name, str(filter_size), str(strides), str(padding)) ) self.outputs = tf.layers.max_pooling3d( self.inputs, filter_size, strides, padding=padding, data_format=data_format, name=name ) self._add_layers(self.outputs)
[docs]class MeanPool3d(Layer): """Mean pooling for 3D volume. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 5. filter_size : tuple of int Pooling window size. strides : tuple of int Strides of the pooling operation. padding : str The padding method: 'valid' or 'same'. data_format : str One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Returns ------- :class:`Layer` A mean pooling 3-D layer with a output rank as 5. """ @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='meanpool3d' ): super(MeanPool3d, self).__init__(prev_layer=prev_layer, name=name) logging.info( "MeanPool3d %s: filter_size: %s strides: %s padding: %s" % (self.name, str(filter_size), str(strides), str(padding)) ) self.outputs = tf.layers.average_pooling3d( prev_layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name ) self._add_layers(self.outputs)
[docs]class GlobalMaxPool1d(Layer): """The :class:`GlobalMaxPool1d` class is a 1D Global Max Pooling layer. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 3 [batch, length, channel]. data_format : str One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Examples --------- >>> x = tf.placeholder("float32", [None, 100, 30]) >>> n = InputLayer(x, name='in') >>> n = GlobalMaxPool1d(n) [None, 30] """ @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, data_format="channels_last", name='globalmaxpool1d'): super(GlobalMaxPool1d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMaxPool1d %s" % self.name) if data_format == 'channels_last': self.outputs = tf.reduce_max(self.inputs, axis=1, name=name) elif data_format == 'channels_first': self.outputs = tf.reduce_max(self.inputs, axis=2, name=name) else: raise ValueError( "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" ) self._add_layers(self.outputs)
[docs]class GlobalMeanPool1d(Layer): """The :class:`GlobalMeanPool1d` class is a 1D Global Mean Pooling layer. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 3 [batch, length, channel]. data_format : str One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Examples --------- >>> import tensorflow as tf >>> import tensorlayer as tl >>> x = tf.placeholder("float32", [None, 100, 30]) >>> n = tl.layers.InputLayer(x, name='in') >>> n = tl.layers.GlobalMeanPool1d(n) [None, 30] """ @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, data_format='channels_last', name='globalmeanpool1d'): super(GlobalMeanPool1d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMeanPool1d %s" % self.name) if data_format == 'channels_last': self.outputs = tf.reduce_mean(self.inputs, axis=1, name=name) elif data_format == 'channels_first': self.outputs = tf.reduce_mean(self.inputs, axis=2, name=name) else: raise ValueError( "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" ) self._add_layers(self.outputs)
[docs]class GlobalMaxPool2d(Layer): """The :class:`GlobalMaxPool2d` class is a 2D Global Max Pooling layer. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 4 [batch, height, width, channel]. data_format : str One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Examples --------- >>> import tensorflow as tf >>> import tensorlayer as tl >>> x = tf.placeholder("float32", [None, 100, 100, 30]) >>> n = tl.layers.InputLayer(x, name='in2') >>> n = tl.layers.GlobalMaxPool2d(n) [None, 30] """ @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, data_format='channels_last', name='globalmaxpool2d'): super(GlobalMaxPool2d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMaxPool2d %s" % self.name) if data_format == 'channels_last': self.outputs = tf.reduce_max(self.inputs, axis=[1, 2], name=name) elif data_format == 'channels_first': self.outputs = tf.reduce_max(self.inputs, axis=[2, 3], name=name) else: raise ValueError( "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" ) self._add_layers(self.outputs)
[docs]class GlobalMeanPool2d(Layer): """The :class:`GlobalMeanPool2d` class is a 2D Global Mean Pooling layer. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 4 [batch, height, width, channel]. data_format : str One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Examples --------- >>> import tensorflow as tf >>> import tensorlayer as tl >>> x = tf.placeholder("float32", [None, 100, 100, 30]) >>> n = tl.layers.InputLayer(x, name='in2') >>> n = tl.layers.GlobalMeanPool2d(n) [None, 30] """ @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, data_format='channels_last', name='globalmeanpool2d'): super(GlobalMeanPool2d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMeanPool2d %s" % self.name) if data_format == 'channels_last': self.outputs = tf.reduce_mean(self.inputs, axis=[1, 2], name=name) elif data_format == 'channels_first': self.outputs = tf.reduce_mean(self.inputs, axis=[2, 3], name=name) else: raise ValueError( "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" ) self._add_layers(self.outputs)
[docs]class GlobalMaxPool3d(Layer): """The :class:`GlobalMaxPool3d` class is a 3D Global Max Pooling layer. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 5 [batch, depth, height, width, channel]. data_format : str One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Examples --------- >>> import tensorflow as tf >>> import tensorlayer as tl >>> x = tf.placeholder("float32", [None, 100, 100, 100, 30]) >>> n = tl.layers.InputLayer(x, name='in') >>> n = tl.layers.GlobalMaxPool3d(n) [None, 30] """ @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, data_format='channels_last', name='globalmaxpool3d'): super(GlobalMaxPool3d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMaxPool3d %s" % self.name) if data_format == 'channels_last': self.outputs = tf.reduce_max(self.inputs, axis=[1, 2, 3], name=name) elif data_format == 'channels_first': self.outputs = tf.reduce_max(self.inputs, axis=[2, 3, 4], name=name) else: raise ValueError( "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" ) self._add_layers(self.outputs)
[docs]class GlobalMeanPool3d(Layer): """The :class:`GlobalMeanPool3d` class is a 3D Global Mean Pooling layer. Parameters ------------ prev_layer : :class:`Layer` The previous layer with a output rank as 5 [batch, depth, height, width, channel]. data_format : str One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. name : str A unique layer name. Examples --------- >>> import tensorflow as tf >>> import tensorlayer as tl >>> x = tf.placeholder("float32", [None, 100, 100, 100, 30]) >>> n = tl.layers.InputLayer(x, name='in') >>> n = tl.layers.GlobalMeanPool2d(n) [None, 30] """ @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release def __init__(self, prev_layer, data_format='channels_last', name='globalmeanpool3d'): super(GlobalMeanPool3d, self).__init__(prev_layer=prev_layer, name=name) logging.info("GlobalMeanPool3d %s" % self.name) if data_format == 'channels_last': self.outputs = tf.reduce_mean(self.inputs, axis=[1, 2, 3], name=name) elif data_format == 'channels_first': self.outputs = tf.reduce_mean(self.inputs, axis=[2, 3, 4], name=name) else: raise ValueError( "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" ) self._add_layers(self.outputs)