Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions docs/modules/layers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
^^^^^^^^^^^^^^^^^^^
Expand Down
184 changes: 81 additions & 103 deletions tensorlayer/layers/pooling.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://www.tensorflow.org/api_docs/python/tf/layers/max_pooling1d>`__ .

Parameters
Expand All @@ -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 <https://www.tensorflow.org/api_docs/python/tf/layers/average_pooling1d>`__ .

Parameters
Expand All @@ -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
-----------
Expand All @@ -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
-----------
Expand All @@ -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'):
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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)

Expand All @@ -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)

Expand All @@ -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)

Expand All @@ -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)

Expand All @@ -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)

Expand All @@ -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