Skip to content

Commit 0b49359

Browse files
zsdonghaoluomai
authored andcommitted
release GlobalMax/MeanPool1/2d (#386)
* release GlobalMax/MeanPool1/2d * release GlobalMax/MeanPool1/2d * move test code to tests/ folder * fixed LG comment * fixed LG comment * Update .travis.yml * Update pooling.py
1 parent f2399a3 commit 0b49359

File tree

4 files changed

+276
-22
lines changed

4 files changed

+276
-22
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ script:
1919
- python tests/test_yapf_format.py
2020
- python tests/test_pydocstyle.py
2121
- python tests/test_mnist_simple.py
22+
- python tests/test_pooling.py

docs/modules/layers.rst

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ The following is an example implementation of a layer that multiplies its input
130130
self.all_drop = dict(layer.all_drop)
131131
132132
# update layer (customized)
133-
self.all_layers.extend( [self.outputs] )
133+
self.all_layers.append(self.outputs)
134134
135135
136136
Your Dense Layer
@@ -280,6 +280,10 @@ Layer list
280280
MeanPool2d
281281
MaxPool3d
282282
MeanPool3d
283+
GlobalMaxPool1d
284+
GlobalMeanPool1d
285+
GlobalMaxPool2d
286+
GlobalMeanPool2d
283287

284288
SubpixelConv1d
285289
SubpixelConv2d
@@ -561,12 +565,27 @@ Padding layer for any modes.
561565

562566
3D Max pooling
563567
^^^^^^^^^^^^^^^^^^^^^^^^^^
564-
.. autofunction:: MaxPool3d
568+
.. autoclass:: MaxPool3d
565569

566570
3D Mean pooling
567571
^^^^^^^^^^^^^^^^^^^^^^^^^^
568-
.. autofunction:: MeanPool3d
572+
.. autoclass:: MeanPool3d
569573

574+
1D Global Max pooling
575+
^^^^^^^^^^^^^^^^^^^^^^^^^^
576+
.. autoclass:: GlobalMaxPool1d
577+
578+
1D Global Mean pooling
579+
^^^^^^^^^^^^^^^^^^^^^^^^^^
580+
.. autoclass:: GlobalMeanPool1d
581+
582+
2D Global Max pooling
583+
^^^^^^^^^^^^^^^^^^^^^^^^^^
584+
.. autoclass:: GlobalMaxPool2d
585+
586+
2D Global Mean pooling
587+
^^^^^^^^^^^^^^^^^^^^^^^^^^
588+
.. autoclass:: GlobalMeanPool2d
570589

571590

572591
Normalization layer

tensorlayer/layers/pooling.py

Lines changed: 229 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def meanpool2d(net, filter_size=(3, 3), strides=(2, 2), padding='SAME', name='me
162162
163163
Parameters
164164
-----------
165-
net : :class:`Layer`
165+
layer : :class:`Layer`
166166
The previous layer with a output rank as 4.
167167
filter_size : tuple of int
168168
(height, width) for filter size.
@@ -186,12 +186,13 @@ def meanpool2d(net, filter_size=(3, 3), strides=(2, 2), padding='SAME', name='me
186186
return net
187187

188188

189-
def maxpool3d(net, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='maxpool3d'):
189+
# def maxpool3d(net, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='maxpool3d'):
190+
class MaxPool3d(Layer):
190191
"""Wrapper for `tf.layers.max_pooling3d <https://www.tensorflow.org/api_docs/python/tf/layers/max_pooling3d>`__ .
191192
192193
Parameters
193194
------------
194-
net : :class:`Layer`
195+
layer : :class:`Layer`
195196
The previous layer with a output rank as 5.
196197
filter_size : tuple of int
197198
Pooling window size.
@@ -213,21 +214,35 @@ def maxpool3d(net, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', da
213214
A max pooling 3-D layer with a output rank as 5.
214215
215216
"""
216-
logging.info("MaxPool3d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding)))
217-
outputs = tf.layers.max_pooling3d(net.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name)
218217

219-
net_new = copy.copy(net)
220-
net_new.outputs = outputs
221-
net_new.all_layers.extend([outputs])
222-
return net_new
218+
def __init__(self, layer, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='maxpool3d'):
219+
220+
# check layer name (fixed)
221+
Layer.__init__(self, name=name)
222+
223+
# the input of this layer is the output of previous layer (fixed)
224+
self.inputs = layer.outputs
225+
226+
logging.info("MaxPool3d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding)))
227+
228+
self.outputs = tf.layers.max_pooling3d(layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name)
229+
230+
# get stuff from previous layer (fixed)
231+
self.all_layers = list(layer.all_layers)
232+
self.all_params = list(layer.all_params)
233+
self.all_drop = dict(layer.all_drop)
223234

235+
# update layer (customized)
236+
self.all_layers.append(self.outputs)
224237

225-
def meanpool3d(net, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='meanpool3d'):
238+
239+
# def meanpool3d(net, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='meanpool3d'):
240+
class MeanPool3d(Layer):
226241
"""Wrapper for `tf.layers.average_pooling3d <https://www.tensorflow.org/api_docs/python/tf/layers/average_pooling3d>`__
227242
228243
Parameters
229244
------------
230-
net : :class:`Layer`
245+
layer : :class:`Layer`
231246
The previous layer with a output rank as 5.
232247
filter_size : tuple of int
233248
Pooling window size.
@@ -249,19 +264,214 @@ def meanpool3d(net, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', d
249264
A mean pooling 3-D layer with a output rank as 5.
250265
251266
"""
252-
logging.info("MeanPool3d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding)))
253-
outputs = tf.layers.average_pooling3d(net.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name)
254267

255-
net_new = copy.copy(net)
256-
net_new.outputs = outputs
257-
net_new.all_layers.extend([outputs])
258-
return net_new
268+
def __init__(self, layer, filter_size=(3, 3, 3), strides=(2, 2, 2), padding='valid', data_format='channels_last', name='meanpool3d'):
269+
# check layer name (fixed)
270+
Layer.__init__(self, name=name)
271+
272+
# the input of this layer is the output of previous layer (fixed)
273+
self.inputs = layer.outputs
274+
275+
# print out info (customized)
276+
logging.info("MeanPool3d %s: filter_size:%s strides:%s padding:%s" % (name, str(filter_size), str(strides), str(padding)))
277+
278+
# operation (customized)
279+
self.outputs = tf.layers.average_pooling3d(layer.outputs, filter_size, strides, padding=padding, data_format=data_format, name=name)
280+
281+
# get stuff from previous layer (fixed)
282+
self.all_layers = list(layer.all_layers)
283+
self.all_params = list(layer.all_params)
284+
self.all_drop = dict(layer.all_drop)
285+
286+
# update layer (customized)
287+
self.all_layers.append(self.outputs)
288+
# self.all_params.extend( [W, b] )
289+
290+
291+
class GlobalMaxPool1d(Layer):
292+
"""The :class:`GlobalMaxPool1d` class is a 1D Global Max Pooling layer.
293+
294+
Parameters
295+
------------
296+
layer : :class:`Layer`
297+
The previous layer with a output rank as 3.
298+
name : str
299+
A unique layer name.
300+
301+
Examples
302+
---------
303+
>>> x = tf.placeholder("float32", [None, 100, 30])
304+
>>> n = InputLayer(x, name='in')
305+
>>> n = GlobalMaxPool1d(n)
306+
... [None, 30]
307+
"""
308+
309+
def __init__(
310+
self,
311+
layer=None,
312+
name='globalmaxpool1d',
313+
):
314+
# check layer name (fixed)
315+
Layer.__init__(self, name=name)
316+
317+
# the input of this layer is the output of previous layer (fixed)
318+
self.inputs = layer.outputs
319+
320+
# print out info (customized)
321+
logging.info("GlobalMaxPool1d %s" % name)
322+
323+
# operation (customized)
324+
self.outputs = tf.reduce_max(layer.outputs, axis=1, name=name)
325+
326+
# get stuff from previous layer (fixed)
327+
self.all_layers = list(layer.all_layers)
328+
self.all_params = list(layer.all_params)
329+
self.all_drop = dict(layer.all_drop)
330+
331+
# update layer (customized)
332+
self.all_layers.append(self.outputs)
333+
# self.all_params.extend( [W, b] )
334+
335+
336+
class GlobalMeanPool1d(Layer):
337+
"""The :class:`GlobalMeanPool1d` class is a 1D Global Mean Pooling layer.
338+
339+
Parameters
340+
------------
341+
layer : :class:`Layer`
342+
The previous layer with a output rank as 3.
343+
name : str
344+
A unique layer name.
345+
346+
Examples
347+
---------
348+
>>> x = tf.placeholder("float32", [None, 100, 30])
349+
>>> n = InputLayer(x, name='in')
350+
>>> n = GlobalMeanPool1d(n)
351+
... [None, 30]
352+
"""
353+
354+
def __init__(
355+
self,
356+
layer=None,
357+
name='globalmeanpool1d',
358+
):
359+
# check layer name (fixed)
360+
Layer.__init__(self, name=name)
361+
362+
# the input of this layer is the output of previous layer (fixed)
363+
self.inputs = layer.outputs
364+
365+
# print out info (customized)
366+
logging.info("GlobalMeanPool1d %s" % name)
367+
368+
# operation (customized)
369+
self.outputs = tf.reduce_mean(layer.outputs, axis=1, name=name)
370+
371+
# get stuff from previous layer (fixed)
372+
self.all_layers = list(layer.all_layers)
373+
self.all_params = list(layer.all_params)
374+
self.all_drop = dict(layer.all_drop)
375+
376+
# update layer (customized)
377+
self.all_layers.append(self.outputs)
378+
# self.all_params.extend( [W, b] )
379+
380+
381+
class GlobalMaxPool2d(Layer):
382+
"""The :class:`GlobalMaxPool2d` class is a 2D Global Max Pooling layer.
383+
384+
Parameters
385+
------------
386+
layer : :class:`Layer`
387+
The previous layer with a output rank as 4.
388+
name : str
389+
A unique layer name.
390+
391+
Examples
392+
---------
393+
>>> x = tf.placeholder("float32", [None, 100, 100, 30])
394+
>>> n = InputLayer(x, name='in2')
395+
>>> n = GlobalMaxPool2d(n)
396+
... [None, 30]
397+
"""
398+
399+
def __init__(
400+
self,
401+
layer=None,
402+
name='globalmaxpool2d',
403+
):
404+
# check layer name (fixed)
405+
Layer.__init__(self, name=name)
406+
407+
# the input of this layer is the output of previous layer (fixed)
408+
self.inputs = layer.outputs
409+
410+
# print out info (customized)
411+
logging.info("GlobalMaxPool2d %s" % name)
412+
413+
# operation (customized)
414+
self.outputs = tf.reduce_max(layer.outputs, axis=[1, 2], name=name)
415+
416+
# get stuff from previous layer (fixed)
417+
self.all_layers = list(layer.all_layers)
418+
self.all_params = list(layer.all_params)
419+
self.all_drop = dict(layer.all_drop)
420+
421+
# update layer (customized)
422+
self.all_layers.append(self.outputs)
423+
# self.all_params.extend( [W, b] )
424+
425+
426+
class GlobalMeanPool2d(Layer):
427+
"""The :class:`GlobalMeanPool2d` class is a 2D Global Mean Pooling layer.
428+
429+
Parameters
430+
------------
431+
layer : :class:`Layer`
432+
The previous layer with a output rank as 4.
433+
name : str
434+
A unique layer name.
435+
436+
Examples
437+
---------
438+
>>> x = tf.placeholder("float32", [None, 100, 100, 30])
439+
>>> n = InputLayer(x, name='in2')
440+
>>> n = GlobalMeanPool2d(n)
441+
... [None, 30]
442+
"""
443+
444+
def __init__(
445+
self,
446+
layer=None,
447+
name='globalmeanpool2d',
448+
):
449+
# check layer name (fixed)
450+
Layer.__init__(self, name=name)
451+
452+
# the input of this layer is the output of previous layer (fixed)
453+
self.inputs = layer.outputs
454+
455+
# print out info (customized)
456+
logging.info("GlobalMeanPool2d %s" % name)
457+
458+
# operation (customized)
459+
self.outputs = tf.reduce_mean(layer.outputs, axis=[1, 2], name=name)
460+
461+
# get stuff from previous layer (fixed)
462+
self.all_layers = list(layer.all_layers)
463+
self.all_params = list(layer.all_params)
464+
self.all_drop = dict(layer.all_drop)
465+
466+
# update layer (customized)
467+
self.all_layers.append(self.outputs)
468+
# self.all_params.extend( [W, b] )
259469

260470

261471
# Alias
262472
MaxPool1d = maxpool1d
263473
MaxPool2d = maxpool2d
264-
MaxPool3d = maxpool3d
474+
# MaxPool3d = maxpool3d
265475
MeanPool1d = meanpool1d
266476
MeanPool2d = meanpool2d
267-
MeanPool3d = meanpool3d
477+
# MeanPool3d = meanpool3d

tests/test_pooling.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import tensorflow as tf
2+
from tensorlayer.layers import InputLayer, GlobalMaxPool1d, GlobalMaxPool2d, MaxPool3d, MeanPool3d
3+
4+
x = tf.placeholder("float32", [None, 100, 30])
5+
n = InputLayer(x, name='in1')
6+
n = GlobalMaxPool1d(n)
7+
print(n)
8+
9+
x = tf.placeholder("float32", [None, 100, 100, 30])
10+
n = InputLayer(x, name='in2')
11+
n = GlobalMaxPool2d(n)
12+
print(n)
13+
14+
x = tf.placeholder("float32", [None, 100, 100, 100, 30])
15+
n = InputLayer(x, name='in3')
16+
n = MaxPool3d(n)
17+
n.print_layers()
18+
print(n)
19+
20+
x = tf.placeholder("float32", [None, 100, 100, 100, 30])
21+
n = InputLayer(x, name='in4')
22+
n = MeanPool3d(n)
23+
n.print_layers()
24+
print(n)

0 commit comments

Comments
 (0)