Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/tensorflow/python/keras/layers/pooling.py: 34%
265 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
1# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# ==============================================================================
15"""Pooling layers."""
17import functools
19from tensorflow.python.framework import tensor_shape
20from tensorflow.python.keras import backend
21from tensorflow.python.keras.engine.base_layer import Layer
22from tensorflow.python.keras.engine.input_spec import InputSpec
23from tensorflow.python.keras.utils import conv_utils
24from tensorflow.python.ops import array_ops
25from tensorflow.python.ops import math_ops
26from tensorflow.python.ops import nn
27from tensorflow.python.util.tf_export import keras_export
30class Pooling1D(Layer):
31 """Pooling layer for arbitrary pooling functions, for 1D inputs.
33 This class only exists for code reuse. It will never be an exposed API.
35 Args:
36 pool_function: The pooling function to apply, e.g. `tf.nn.max_pool2d`.
37 pool_size: An integer or tuple/list of a single integer,
38 representing the size of the pooling window.
39 strides: An integer or tuple/list of a single integer, specifying the
40 strides of the pooling operation.
41 padding: A string. The padding method, either 'valid' or 'same'.
42 Case-insensitive.
43 data_format: A string,
44 one of `channels_last` (default) or `channels_first`.
45 The ordering of the dimensions in the inputs.
46 `channels_last` corresponds to inputs with shape
47 `(batch, steps, features)` while `channels_first`
48 corresponds to inputs with shape
49 `(batch, features, steps)`.
50 name: A string, the name of the layer.
51 """
53 def __init__(self, pool_function, pool_size, strides,
54 padding='valid', data_format='channels_last',
55 name=None, **kwargs):
56 super(Pooling1D, self).__init__(name=name, **kwargs)
57 if data_format is None:
58 data_format = backend.image_data_format()
59 if strides is None:
60 strides = pool_size
61 self.pool_function = pool_function
62 self.pool_size = conv_utils.normalize_tuple(pool_size, 1, 'pool_size')
63 self.strides = conv_utils.normalize_tuple(strides, 1, 'strides')
64 self.padding = conv_utils.normalize_padding(padding)
65 self.data_format = conv_utils.normalize_data_format(data_format)
66 self.input_spec = InputSpec(ndim=3)
68 def call(self, inputs):
69 pad_axis = 2 if self.data_format == 'channels_last' else 3
70 inputs = array_ops.expand_dims(inputs, pad_axis)
71 outputs = self.pool_function(
72 inputs,
73 self.pool_size + (1,),
74 strides=self.strides + (1,),
75 padding=self.padding,
76 data_format=self.data_format)
77 return array_ops.squeeze(outputs, pad_axis)
79 def compute_output_shape(self, input_shape):
80 input_shape = tensor_shape.TensorShape(input_shape).as_list()
81 if self.data_format == 'channels_first':
82 steps = input_shape[2]
83 features = input_shape[1]
84 else:
85 steps = input_shape[1]
86 features = input_shape[2]
87 length = conv_utils.conv_output_length(steps,
88 self.pool_size[0],
89 self.padding,
90 self.strides[0])
91 if self.data_format == 'channels_first':
92 return tensor_shape.TensorShape([input_shape[0], features, length])
93 else:
94 return tensor_shape.TensorShape([input_shape[0], length, features])
96 def get_config(self):
97 config = {
98 'strides': self.strides,
99 'pool_size': self.pool_size,
100 'padding': self.padding,
101 'data_format': self.data_format,
102 }
103 base_config = super(Pooling1D, self).get_config()
104 return dict(list(base_config.items()) + list(config.items()))
107@keras_export('keras.layers.MaxPool1D', 'keras.layers.MaxPooling1D')
108class MaxPooling1D(Pooling1D):
109 """Max pooling operation for 1D temporal data.
111 Downsamples the input representation by taking the maximum value over a
112 spatial window of size `pool_size`. The window is shifted by `strides`. The
113 resulting output, when using the `"valid"` padding option, has a shape of:
114 `output_shape = (input_shape - pool_size + 1) / strides)`
116 The resulting output shape when using the `"same"` padding option is:
117 `output_shape = input_shape / strides`
119 For example, for `strides=1` and `padding="valid"`:
121 >>> x = tf.constant([1., 2., 3., 4., 5.])
122 >>> x = tf.reshape(x, [1, 5, 1])
123 >>> max_pool_1d = tf.keras.layers.MaxPooling1D(pool_size=2,
124 ... strides=1, padding='valid')
125 >>> max_pool_1d(x)
126 <tf.Tensor: shape=(1, 4, 1), dtype=float32, numpy=
127 array([[[2.],
128 [3.],
129 [4.],
130 [5.]]], dtype=float32)>
132 For example, for `strides=2` and `padding="valid"`:
134 >>> x = tf.constant([1., 2., 3., 4., 5.])
135 >>> x = tf.reshape(x, [1, 5, 1])
136 >>> max_pool_1d = tf.keras.layers.MaxPooling1D(pool_size=2,
137 ... strides=2, padding='valid')
138 >>> max_pool_1d(x)
139 <tf.Tensor: shape=(1, 2, 1), dtype=float32, numpy=
140 array([[[2.],
141 [4.]]], dtype=float32)>
143 For example, for `strides=1` and `padding="same"`:
145 >>> x = tf.constant([1., 2., 3., 4., 5.])
146 >>> x = tf.reshape(x, [1, 5, 1])
147 >>> max_pool_1d = tf.keras.layers.MaxPooling1D(pool_size=2,
148 ... strides=1, padding='same')
149 >>> max_pool_1d(x)
150 <tf.Tensor: shape=(1, 5, 1), dtype=float32, numpy=
151 array([[[2.],
152 [3.],
153 [4.],
154 [5.],
155 [5.]]], dtype=float32)>
157 Args:
158 pool_size: Integer, size of the max pooling window.
159 strides: Integer, or None. Specifies how much the pooling window moves
160 for each pooling step.
161 If None, it will default to `pool_size`.
162 padding: One of `"valid"` or `"same"` (case-insensitive).
163 `"valid"` means no padding. `"same"` results in padding evenly to
164 the left/right or up/down of the input such that output has the same
165 height/width dimension as the input.
166 data_format: A string,
167 one of `channels_last` (default) or `channels_first`.
168 The ordering of the dimensions in the inputs.
169 `channels_last` corresponds to inputs with shape
170 `(batch, steps, features)` while `channels_first`
171 corresponds to inputs with shape
172 `(batch, features, steps)`.
174 Input shape:
175 - If `data_format='channels_last'`:
176 3D tensor with shape `(batch_size, steps, features)`.
177 - If `data_format='channels_first'`:
178 3D tensor with shape `(batch_size, features, steps)`.
180 Output shape:
181 - If `data_format='channels_last'`:
182 3D tensor with shape `(batch_size, downsampled_steps, features)`.
183 - If `data_format='channels_first'`:
184 3D tensor with shape `(batch_size, features, downsampled_steps)`.
185 """
187 def __init__(self, pool_size=2, strides=None,
188 padding='valid', data_format='channels_last', **kwargs):
190 super(MaxPooling1D, self).__init__(
191 functools.partial(backend.pool2d, pool_mode='max'),
192 pool_size=pool_size,
193 strides=strides,
194 padding=padding,
195 data_format=data_format,
196 **kwargs)
199@keras_export('keras.layers.AveragePooling1D', 'keras.layers.AvgPool1D')
200class AveragePooling1D(Pooling1D):
201 """Average pooling for temporal data.
203 Downsamples the input representation by taking the average value over the
204 window defined by `pool_size`. The window is shifted by `strides`. The
205 resulting output when using "valid" padding option has a shape of:
206 `output_shape = (input_shape - pool_size + 1) / strides)`
208 The resulting output shape when using the "same" padding option is:
209 `output_shape = input_shape / strides`
211 For example, for strides=1 and padding="valid":
213 >>> x = tf.constant([1., 2., 3., 4., 5.])
214 >>> x = tf.reshape(x, [1, 5, 1])
215 >>> x
216 <tf.Tensor: shape=(1, 5, 1), dtype=float32, numpy=
217 array([[[1.],
218 [2.],
219 [3.],
220 [4.],
221 [5.]], dtype=float32)>
222 >>> avg_pool_1d = tf.keras.layers.AveragePooling1D(pool_size=2,
223 ... strides=1, padding='valid')
224 >>> avg_pool_1d(x)
225 <tf.Tensor: shape=(1, 4, 1), dtype=float32, numpy=
226 array([[[1.5],
227 [2.5],
228 [3.5],
229 [4.5]]], dtype=float32)>
231 For example, for strides=2 and padding="valid":
233 >>> x = tf.constant([1., 2., 3., 4., 5.])
234 >>> x = tf.reshape(x, [1, 5, 1])
235 >>> x
236 <tf.Tensor: shape=(1, 5, 1), dtype=float32, numpy=
237 array([[[1.],
238 [2.],
239 [3.],
240 [4.],
241 [5.]], dtype=float32)>
242 >>> avg_pool_1d = tf.keras.layers.AveragePooling1D(pool_size=2,
243 ... strides=2, padding='valid')
244 >>> avg_pool_1d(x)
245 <tf.Tensor: shape=(1, 2, 1), dtype=float32, numpy=
246 array([[[1.5],
247 [3.5]]], dtype=float32)>
249 For example, for strides=1 and padding="same":
251 >>> x = tf.constant([1., 2., 3., 4., 5.])
252 >>> x = tf.reshape(x, [1, 5, 1])
253 >>> x
254 <tf.Tensor: shape=(1, 5, 1), dtype=float32, numpy=
255 array([[[1.],
256 [2.],
257 [3.],
258 [4.],
259 [5.]], dtype=float32)>
260 >>> avg_pool_1d = tf.keras.layers.AveragePooling1D(pool_size=2,
261 ... strides=1, padding='same')
262 >>> avg_pool_1d(x)
263 <tf.Tensor: shape=(1, 5, 1), dtype=float32, numpy=
264 array([[[1.5],
265 [2.5],
266 [3.5],
267 [4.5],
268 [5.]]], dtype=float32)>
270 Args:
271 pool_size: Integer, size of the average pooling windows.
272 strides: Integer, or None. Factor by which to downscale.
273 E.g. 2 will halve the input.
274 If None, it will default to `pool_size`.
275 padding: One of `"valid"` or `"same"` (case-insensitive).
276 `"valid"` means no padding. `"same"` results in padding evenly to
277 the left/right or up/down of the input such that output has the same
278 height/width dimension as the input.
279 data_format: A string,
280 one of `channels_last` (default) or `channels_first`.
281 The ordering of the dimensions in the inputs.
282 `channels_last` corresponds to inputs with shape
283 `(batch, steps, features)` while `channels_first`
284 corresponds to inputs with shape
285 `(batch, features, steps)`.
287 Input shape:
288 - If `data_format='channels_last'`:
289 3D tensor with shape `(batch_size, steps, features)`.
290 - If `data_format='channels_first'`:
291 3D tensor with shape `(batch_size, features, steps)`.
293 Output shape:
294 - If `data_format='channels_last'`:
295 3D tensor with shape `(batch_size, downsampled_steps, features)`.
296 - If `data_format='channels_first'`:
297 3D tensor with shape `(batch_size, features, downsampled_steps)`.
298 """
300 def __init__(self, pool_size=2, strides=None,
301 padding='valid', data_format='channels_last', **kwargs):
302 super(AveragePooling1D, self).__init__(
303 functools.partial(backend.pool2d, pool_mode='avg'),
304 pool_size=pool_size,
305 strides=strides,
306 padding=padding,
307 data_format=data_format,
308 **kwargs)
311class Pooling2D(Layer):
312 """Pooling layer for arbitrary pooling functions, for 2D inputs (e.g. images).
314 This class only exists for code reuse. It will never be an exposed API.
316 Args:
317 pool_function: The pooling function to apply, e.g. `tf.nn.max_pool2d`.
318 pool_size: An integer or tuple/list of 2 integers: (pool_height, pool_width)
319 specifying the size of the pooling window.
320 Can be a single integer to specify the same value for
321 all spatial dimensions.
322 strides: An integer or tuple/list of 2 integers,
323 specifying the strides of the pooling operation.
324 Can be a single integer to specify the same value for
325 all spatial dimensions.
326 padding: A string. The padding method, either 'valid' or 'same'.
327 Case-insensitive.
328 data_format: A string, one of `channels_last` (default) or `channels_first`.
329 The ordering of the dimensions in the inputs.
330 `channels_last` corresponds to inputs with shape
331 `(batch, height, width, channels)` while `channels_first` corresponds to
332 inputs with shape `(batch, channels, height, width)`.
333 name: A string, the name of the layer.
334 """
336 def __init__(self, pool_function, pool_size, strides,
337 padding='valid', data_format=None,
338 name=None, **kwargs):
339 super(Pooling2D, self).__init__(name=name, **kwargs)
340 if data_format is None:
341 data_format = backend.image_data_format()
342 if strides is None:
343 strides = pool_size
344 self.pool_function = pool_function
345 self.pool_size = conv_utils.normalize_tuple(pool_size, 2, 'pool_size')
346 self.strides = conv_utils.normalize_tuple(strides, 2, 'strides')
347 self.padding = conv_utils.normalize_padding(padding)
348 self.data_format = conv_utils.normalize_data_format(data_format)
349 self.input_spec = InputSpec(ndim=4)
351 def call(self, inputs):
352 if self.data_format == 'channels_last':
353 pool_shape = (1,) + self.pool_size + (1,)
354 strides = (1,) + self.strides + (1,)
355 else:
356 pool_shape = (1, 1) + self.pool_size
357 strides = (1, 1) + self.strides
358 outputs = self.pool_function(
359 inputs,
360 ksize=pool_shape,
361 strides=strides,
362 padding=self.padding.upper(),
363 data_format=conv_utils.convert_data_format(self.data_format, 4))
364 return outputs
366 def compute_output_shape(self, input_shape):
367 input_shape = tensor_shape.TensorShape(input_shape).as_list()
368 if self.data_format == 'channels_first':
369 rows = input_shape[2]
370 cols = input_shape[3]
371 else:
372 rows = input_shape[1]
373 cols = input_shape[2]
374 rows = conv_utils.conv_output_length(rows, self.pool_size[0], self.padding,
375 self.strides[0])
376 cols = conv_utils.conv_output_length(cols, self.pool_size[1], self.padding,
377 self.strides[1])
378 if self.data_format == 'channels_first':
379 return tensor_shape.TensorShape(
380 [input_shape[0], input_shape[1], rows, cols])
381 else:
382 return tensor_shape.TensorShape(
383 [input_shape[0], rows, cols, input_shape[3]])
385 def get_config(self):
386 config = {
387 'pool_size': self.pool_size,
388 'padding': self.padding,
389 'strides': self.strides,
390 'data_format': self.data_format
391 }
392 base_config = super(Pooling2D, self).get_config()
393 return dict(list(base_config.items()) + list(config.items()))
396@keras_export('keras.layers.MaxPool2D', 'keras.layers.MaxPooling2D')
397class MaxPooling2D(Pooling2D):
398 """Max pooling operation for 2D spatial data.
400 Downsamples the input along its spatial dimensions (height and width)
401 by taking the maximum value over an input window
402 (of size defined by `pool_size`) for each channel of the input.
403 The window is shifted by `strides` along each dimension.
405 The resulting output,
406 when using the `"valid"` padding option, has a spatial shape
407 (number of rows or columns) of:
408 `output_shape = math.floor((input_shape - pool_size) / strides) + 1`
409 (when `input_shape >= pool_size`)
411 The resulting output shape when using the `"same"` padding option is:
412 `output_shape = math.floor((input_shape - 1) / strides) + 1`
414 For example, for `strides=(1, 1)` and `padding="valid"`:
416 >>> x = tf.constant([[1., 2., 3.],
417 ... [4., 5., 6.],
418 ... [7., 8., 9.]])
419 >>> x = tf.reshape(x, [1, 3, 3, 1])
420 >>> max_pool_2d = tf.keras.layers.MaxPooling2D(pool_size=(2, 2),
421 ... strides=(1, 1), padding='valid')
422 >>> max_pool_2d(x)
423 <tf.Tensor: shape=(1, 2, 2, 1), dtype=float32, numpy=
424 array([[[[5.],
425 [6.]],
426 [[8.],
427 [9.]]]], dtype=float32)>
429 For example, for `strides=(2, 2)` and `padding="valid"`:
431 >>> x = tf.constant([[1., 2., 3., 4.],
432 ... [5., 6., 7., 8.],
433 ... [9., 10., 11., 12.]])
434 >>> x = tf.reshape(x, [1, 3, 4, 1])
435 >>> max_pool_2d = tf.keras.layers.MaxPooling2D(pool_size=(2, 2),
436 ... strides=(2, 2), padding='valid')
437 >>> max_pool_2d(x)
438 <tf.Tensor: shape=(1, 1, 2, 1), dtype=float32, numpy=
439 array([[[[6.],
440 [8.]]]], dtype=float32)>
442 Usage Example:
444 >>> input_image = tf.constant([[[[1.], [1.], [2.], [4.]],
445 ... [[2.], [2.], [3.], [2.]],
446 ... [[4.], [1.], [1.], [1.]],
447 ... [[2.], [2.], [1.], [4.]]]])
448 >>> output = tf.constant([[[[1], [0]],
449 ... [[0], [1]]]])
450 >>> model = tf.keras.models.Sequential()
451 >>> model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2),
452 ... input_shape=(4, 4, 1)))
453 >>> model.compile('adam', 'mean_squared_error')
454 >>> model.predict(input_image, steps=1)
455 array([[[[2.],
456 [4.]],
457 [[4.],
458 [4.]]]], dtype=float32)
460 For example, for stride=(1, 1) and padding="same":
462 >>> x = tf.constant([[1., 2., 3.],
463 ... [4., 5., 6.],
464 ... [7., 8., 9.]])
465 >>> x = tf.reshape(x, [1, 3, 3, 1])
466 >>> max_pool_2d = tf.keras.layers.MaxPooling2D(pool_size=(2, 2),
467 ... strides=(1, 1), padding='same')
468 >>> max_pool_2d(x)
469 <tf.Tensor: shape=(1, 3, 3, 1), dtype=float32, numpy=
470 array([[[[5.],
471 [6.],
472 [6.]],
473 [[8.],
474 [9.],
475 [9.]],
476 [[8.],
477 [9.],
478 [9.]]]], dtype=float32)>
480 Args:
481 pool_size: integer or tuple of 2 integers,
482 window size over which to take the maximum.
483 `(2, 2)` will take the max value over a 2x2 pooling window.
484 If only one integer is specified, the same window length
485 will be used for both dimensions.
486 strides: Integer, tuple of 2 integers, or None.
487 Strides values. Specifies how far the pooling window moves
488 for each pooling step. If None, it will default to `pool_size`.
489 padding: One of `"valid"` or `"same"` (case-insensitive).
490 `"valid"` means no padding. `"same"` results in padding evenly to
491 the left/right or up/down of the input such that output has the same
492 height/width dimension as the input.
493 data_format: A string,
494 one of `channels_last` (default) or `channels_first`.
495 The ordering of the dimensions in the inputs.
496 `channels_last` corresponds to inputs with shape
497 `(batch, height, width, channels)` while `channels_first`
498 corresponds to inputs with shape
499 `(batch, channels, height, width)`.
500 It defaults to the `image_data_format` value found in your
501 Keras config file at `~/.keras/keras.json`.
502 If you never set it, then it will be "channels_last".
504 Input shape:
505 - If `data_format='channels_last'`:
506 4D tensor with shape `(batch_size, rows, cols, channels)`.
507 - If `data_format='channels_first'`:
508 4D tensor with shape `(batch_size, channels, rows, cols)`.
510 Output shape:
511 - If `data_format='channels_last'`:
512 4D tensor with shape `(batch_size, pooled_rows, pooled_cols, channels)`.
513 - If `data_format='channels_first'`:
514 4D tensor with shape `(batch_size, channels, pooled_rows, pooled_cols)`.
516 Returns:
517 A tensor of rank 4 representing the maximum pooled values. See above for
518 output shape.
519 """
521 def __init__(self,
522 pool_size=(2, 2),
523 strides=None,
524 padding='valid',
525 data_format=None,
526 **kwargs):
527 super(MaxPooling2D, self).__init__(
528 nn.max_pool,
529 pool_size=pool_size, strides=strides,
530 padding=padding, data_format=data_format, **kwargs)
533@keras_export('keras.layers.AveragePooling2D', 'keras.layers.AvgPool2D')
534class AveragePooling2D(Pooling2D):
535 """Average pooling operation for spatial data.
537 Downsamples the input along its spatial dimensions (height and width)
538 by taking the average value over an input window
539 (of size defined by `pool_size`) for each channel of the input.
540 The window is shifted by `strides` along each dimension.
542 The resulting output when using `"valid"` padding option has a shape
543 (number of rows or columns) of:
544 `output_shape = math.floor((input_shape - pool_size) / strides) + 1`
545 (when `input_shape >= pool_size`)
547 The resulting output shape when using the `"same"` padding option is:
548 `output_shape = math.floor((input_shape - 1) / strides) + 1`
550 For example, for `strides=(1, 1)` and `padding="valid"`:
552 >>> x = tf.constant([[1., 2., 3.],
553 ... [4., 5., 6.],
554 ... [7., 8., 9.]])
555 >>> x = tf.reshape(x, [1, 3, 3, 1])
556 >>> avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
557 ... strides=(1, 1), padding='valid')
558 >>> avg_pool_2d(x)
559 <tf.Tensor: shape=(1, 2, 2, 1), dtype=float32, numpy=
560 array([[[[3.],
561 [4.]],
562 [[6.],
563 [7.]]]], dtype=float32)>
565 For example, for `stride=(2, 2)` and `padding="valid"`:
567 >>> x = tf.constant([[1., 2., 3., 4.],
568 ... [5., 6., 7., 8.],
569 ... [9., 10., 11., 12.]])
570 >>> x = tf.reshape(x, [1, 3, 4, 1])
571 >>> avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
572 ... strides=(2, 2), padding='valid')
573 >>> avg_pool_2d(x)
574 <tf.Tensor: shape=(1, 1, 2, 1), dtype=float32, numpy=
575 array([[[[3.5],
576 [5.5]]]], dtype=float32)>
578 For example, for `strides=(1, 1)` and `padding="same"`:
580 >>> x = tf.constant([[1., 2., 3.],
581 ... [4., 5., 6.],
582 ... [7., 8., 9.]])
583 >>> x = tf.reshape(x, [1, 3, 3, 1])
584 >>> avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
585 ... strides=(1, 1), padding='same')
586 >>> avg_pool_2d(x)
587 <tf.Tensor: shape=(1, 3, 3, 1), dtype=float32, numpy=
588 array([[[[3.],
589 [4.],
590 [4.5]],
591 [[6.],
592 [7.],
593 [7.5]],
594 [[7.5],
595 [8.5],
596 [9.]]]], dtype=float32)>
598 Args:
599 pool_size: integer or tuple of 2 integers,
600 factors by which to downscale (vertical, horizontal).
601 `(2, 2)` will halve the input in both spatial dimension.
602 If only one integer is specified, the same window length
603 will be used for both dimensions.
604 strides: Integer, tuple of 2 integers, or None.
605 Strides values.
606 If None, it will default to `pool_size`.
607 padding: One of `"valid"` or `"same"` (case-insensitive).
608 `"valid"` means no padding. `"same"` results in padding evenly to
609 the left/right or up/down of the input such that output has the same
610 height/width dimension as the input.
611 data_format: A string,
612 one of `channels_last` (default) or `channels_first`.
613 The ordering of the dimensions in the inputs.
614 `channels_last` corresponds to inputs with shape
615 `(batch, height, width, channels)` while `channels_first`
616 corresponds to inputs with shape
617 `(batch, channels, height, width)`.
618 It defaults to the `image_data_format` value found in your
619 Keras config file at `~/.keras/keras.json`.
620 If you never set it, then it will be "channels_last".
622 Input shape:
623 - If `data_format='channels_last'`:
624 4D tensor with shape `(batch_size, rows, cols, channels)`.
625 - If `data_format='channels_first'`:
626 4D tensor with shape `(batch_size, channels, rows, cols)`.
628 Output shape:
629 - If `data_format='channels_last'`:
630 4D tensor with shape `(batch_size, pooled_rows, pooled_cols, channels)`.
631 - If `data_format='channels_first'`:
632 4D tensor with shape `(batch_size, channels, pooled_rows, pooled_cols)`.
633 """
635 def __init__(self,
636 pool_size=(2, 2),
637 strides=None,
638 padding='valid',
639 data_format=None,
640 **kwargs):
641 super(AveragePooling2D, self).__init__(
642 nn.avg_pool,
643 pool_size=pool_size, strides=strides,
644 padding=padding, data_format=data_format, **kwargs)
647class Pooling3D(Layer):
648 """Pooling layer for arbitrary pooling functions, for 3D inputs.
650 This class only exists for code reuse. It will never be an exposed API.
652 Args:
653 pool_function: The pooling function to apply, e.g. `tf.nn.max_pool2d`.
654 pool_size: An integer or tuple/list of 3 integers:
655 (pool_depth, pool_height, pool_width)
656 specifying the size of the pooling window.
657 Can be a single integer to specify the same value for
658 all spatial dimensions.
659 strides: An integer or tuple/list of 3 integers,
660 specifying the strides of the pooling operation.
661 Can be a single integer to specify the same value for
662 all spatial dimensions.
663 padding: A string. The padding method, either 'valid' or 'same'.
664 Case-insensitive.
665 data_format: A string, one of `channels_last` (default) or `channels_first`.
666 The ordering of the dimensions in the inputs.
667 `channels_last` corresponds to inputs with shape
668 `(batch, depth, height, width, channels)`
669 while `channels_first` corresponds to
670 inputs with shape `(batch, channels, depth, height, width)`.
671 name: A string, the name of the layer.
672 """
674 def __init__(self, pool_function, pool_size, strides,
675 padding='valid', data_format='channels_last',
676 name=None, **kwargs):
677 super(Pooling3D, self).__init__(name=name, **kwargs)
678 if data_format is None:
679 data_format = backend.image_data_format()
680 if strides is None:
681 strides = pool_size
682 self.pool_function = pool_function
683 self.pool_size = conv_utils.normalize_tuple(pool_size, 3, 'pool_size')
684 self.strides = conv_utils.normalize_tuple(strides, 3, 'strides')
685 self.padding = conv_utils.normalize_padding(padding)
686 self.data_format = conv_utils.normalize_data_format(data_format)
687 self.input_spec = InputSpec(ndim=5)
689 def call(self, inputs):
690 pool_shape = (1,) + self.pool_size + (1,)
691 strides = (1,) + self.strides + (1,)
693 if self.data_format == 'channels_first':
694 # TF does not support `channels_first` with 3D pooling operations,
695 # so we must handle this case manually.
696 # TODO(fchollet): remove this when TF pooling is feature-complete.
697 inputs = array_ops.transpose(inputs, (0, 2, 3, 4, 1))
699 outputs = self.pool_function(
700 inputs,
701 ksize=pool_shape,
702 strides=strides,
703 padding=self.padding.upper())
705 if self.data_format == 'channels_first':
706 outputs = array_ops.transpose(outputs, (0, 4, 1, 2, 3))
707 return outputs
709 def compute_output_shape(self, input_shape):
710 input_shape = tensor_shape.TensorShape(input_shape).as_list()
711 if self.data_format == 'channels_first':
712 len_dim1 = input_shape[2]
713 len_dim2 = input_shape[3]
714 len_dim3 = input_shape[4]
715 else:
716 len_dim1 = input_shape[1]
717 len_dim2 = input_shape[2]
718 len_dim3 = input_shape[3]
719 len_dim1 = conv_utils.conv_output_length(len_dim1, self.pool_size[0],
720 self.padding, self.strides[0])
721 len_dim2 = conv_utils.conv_output_length(len_dim2, self.pool_size[1],
722 self.padding, self.strides[1])
723 len_dim3 = conv_utils.conv_output_length(len_dim3, self.pool_size[2],
724 self.padding, self.strides[2])
725 if self.data_format == 'channels_first':
726 return tensor_shape.TensorShape(
727 [input_shape[0], input_shape[1], len_dim1, len_dim2, len_dim3])
728 else:
729 return tensor_shape.TensorShape(
730 [input_shape[0], len_dim1, len_dim2, len_dim3, input_shape[4]])
732 def get_config(self):
733 config = {
734 'pool_size': self.pool_size,
735 'padding': self.padding,
736 'strides': self.strides,
737 'data_format': self.data_format
738 }
739 base_config = super(Pooling3D, self).get_config()
740 return dict(list(base_config.items()) + list(config.items()))
743@keras_export('keras.layers.MaxPool3D', 'keras.layers.MaxPooling3D')
744class MaxPooling3D(Pooling3D):
745 """Max pooling operation for 3D data (spatial or spatio-temporal).
747 Downsamples the input along its spatial dimensions (depth, height, and width)
748 by taking the maximum value over an input window
749 (of size defined by `pool_size`) for each channel of the input.
750 The window is shifted by `strides` along each dimension.
752 Args:
753 pool_size: Tuple of 3 integers,
754 factors by which to downscale (dim1, dim2, dim3).
755 `(2, 2, 2)` will halve the size of the 3D input in each dimension.
756 strides: tuple of 3 integers, or None. Strides values.
757 padding: One of `"valid"` or `"same"` (case-insensitive).
758 `"valid"` means no padding. `"same"` results in padding evenly to
759 the left/right or up/down of the input such that output has the same
760 height/width dimension as the input.
761 data_format: A string,
762 one of `channels_last` (default) or `channels_first`.
763 The ordering of the dimensions in the inputs.
764 `channels_last` corresponds to inputs with shape
765 `(batch, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
766 while `channels_first` corresponds to inputs with shape
767 `(batch, channels, spatial_dim1, spatial_dim2, spatial_dim3)`.
768 It defaults to the `image_data_format` value found in your
769 Keras config file at `~/.keras/keras.json`.
770 If you never set it, then it will be "channels_last".
772 Input shape:
773 - If `data_format='channels_last'`:
774 5D tensor with shape:
775 `(batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
776 - If `data_format='channels_first'`:
777 5D tensor with shape:
778 `(batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)`
780 Output shape:
781 - If `data_format='channels_last'`:
782 5D tensor with shape:
783 `(batch_size, pooled_dim1, pooled_dim2, pooled_dim3, channels)`
784 - If `data_format='channels_first'`:
785 5D tensor with shape:
786 `(batch_size, channels, pooled_dim1, pooled_dim2, pooled_dim3)`
788 Example:
790 ```python
791 depth = 30
792 height = 30
793 width = 30
794 input_channels = 3
796 inputs = tf.keras.Input(shape=(depth, height, width, input_channels))
797 layer = tf.keras.layers.MaxPooling3D(pool_size=3)
798 outputs = layer(inputs) # Shape: (batch_size, 10, 10, 10, 3)
799 ```
800 """
802 def __init__(self,
803 pool_size=(2, 2, 2),
804 strides=None,
805 padding='valid',
806 data_format=None,
807 **kwargs):
808 super(MaxPooling3D, self).__init__(
809 nn.max_pool3d,
810 pool_size=pool_size, strides=strides,
811 padding=padding, data_format=data_format, **kwargs)
814@keras_export('keras.layers.AveragePooling3D', 'keras.layers.AvgPool3D')
815class AveragePooling3D(Pooling3D):
816 """Average pooling operation for 3D data (spatial or spatio-temporal).
818 Downsamples the input along its spatial dimensions (depth, height, and width)
819 by taking the average value over an input window
820 (of size defined by `pool_size`) for each channel of the input.
821 The window is shifted by `strides` along each dimension.
823 Args:
824 pool_size: tuple of 3 integers,
825 factors by which to downscale (dim1, dim2, dim3).
826 `(2, 2, 2)` will halve the size of the 3D input in each dimension.
827 strides: tuple of 3 integers, or None. Strides values.
828 padding: One of `"valid"` or `"same"` (case-insensitive).
829 `"valid"` means no padding. `"same"` results in padding evenly to
830 the left/right or up/down of the input such that output has the same
831 height/width dimension as the input.
832 data_format: A string,
833 one of `channels_last` (default) or `channels_first`.
834 The ordering of the dimensions in the inputs.
835 `channels_last` corresponds to inputs with shape
836 `(batch, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
837 while `channels_first` corresponds to inputs with shape
838 `(batch, channels, spatial_dim1, spatial_dim2, spatial_dim3)`.
839 It defaults to the `image_data_format` value found in your
840 Keras config file at `~/.keras/keras.json`.
841 If you never set it, then it will be "channels_last".
843 Input shape:
844 - If `data_format='channels_last'`:
845 5D tensor with shape:
846 `(batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
847 - If `data_format='channels_first'`:
848 5D tensor with shape:
849 `(batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)`
851 Output shape:
852 - If `data_format='channels_last'`:
853 5D tensor with shape:
854 `(batch_size, pooled_dim1, pooled_dim2, pooled_dim3, channels)`
855 - If `data_format='channels_first'`:
856 5D tensor with shape:
857 `(batch_size, channels, pooled_dim1, pooled_dim2, pooled_dim3)`
859 Example:
861 ```python
862 depth = 30
863 height = 30
864 width = 30
865 input_channels = 3
867 inputs = tf.keras.Input(shape=(depth, height, width, input_channels))
868 layer = tf.keras.layers.AveragePooling3D(pool_size=3)
869 outputs = layer(inputs) # Shape: (batch_size, 10, 10, 10, 3)
870 ```
871 """
873 def __init__(self,
874 pool_size=(2, 2, 2),
875 strides=None,
876 padding='valid',
877 data_format=None,
878 **kwargs):
879 super(AveragePooling3D, self).__init__(
880 nn.avg_pool3d,
881 pool_size=pool_size, strides=strides,
882 padding=padding, data_format=data_format, **kwargs)
885class GlobalPooling1D(Layer):
886 """Abstract class for different global pooling 1D layers."""
888 def __init__(self, data_format='channels_last', keepdims=False, **kwargs):
889 super(GlobalPooling1D, self).__init__(**kwargs)
890 self.input_spec = InputSpec(ndim=3)
891 self.data_format = conv_utils.normalize_data_format(data_format)
892 self.keepdims = keepdims
894 def compute_output_shape(self, input_shape):
895 input_shape = tensor_shape.TensorShape(input_shape).as_list()
896 if self.data_format == 'channels_first':
897 if self.keepdims:
898 return tensor_shape.TensorShape([input_shape[0], input_shape[1], 1])
899 else:
900 return tensor_shape.TensorShape([input_shape[0], input_shape[1]])
901 else:
902 if self.keepdims:
903 return tensor_shape.TensorShape([input_shape[0], 1, input_shape[2]])
904 else:
905 return tensor_shape.TensorShape([input_shape[0], input_shape[2]])
907 def call(self, inputs):
908 raise NotImplementedError
910 def get_config(self):
911 config = {'data_format': self.data_format, 'keepdims': self.keepdims}
912 base_config = super(GlobalPooling1D, self).get_config()
913 return dict(list(base_config.items()) + list(config.items()))
916@keras_export('keras.layers.GlobalAveragePooling1D',
917 'keras.layers.GlobalAvgPool1D')
918class GlobalAveragePooling1D(GlobalPooling1D):
919 """Global average pooling operation for temporal data.
921 Examples:
923 >>> input_shape = (2, 3, 4)
924 >>> x = tf.random.normal(input_shape)
925 >>> y = tf.keras.layers.GlobalAveragePooling1D()(x)
926 >>> print(y.shape)
927 (2, 4)
929 Args:
930 data_format: A string,
931 one of `channels_last` (default) or `channels_first`.
932 The ordering of the dimensions in the inputs.
933 `channels_last` corresponds to inputs with shape
934 `(batch, steps, features)` while `channels_first`
935 corresponds to inputs with shape
936 `(batch, features, steps)`.
937 keepdims: A boolean, whether to keep the temporal dimension or not.
938 If `keepdims` is `False` (default), the rank of the tensor is reduced
939 for spatial dimensions.
940 If `keepdims` is `True`, the temporal dimension are retained with
941 length 1.
942 The behavior is the same as for `tf.reduce_mean` or `np.mean`.
944 Call arguments:
945 inputs: A 3D tensor.
946 mask: Binary tensor of shape `(batch_size, steps)` indicating whether
947 a given step should be masked (excluded from the average).
949 Input shape:
950 - If `data_format='channels_last'`:
951 3D tensor with shape:
952 `(batch_size, steps, features)`
953 - If `data_format='channels_first'`:
954 3D tensor with shape:
955 `(batch_size, features, steps)`
957 Output shape:
958 - If `keepdims`=False:
959 2D tensor with shape `(batch_size, features)`.
960 - If `keepdims`=True:
961 - If `data_format='channels_last'`:
962 3D tensor with shape `(batch_size, 1, features)`
963 - If `data_format='channels_first'`:
964 3D tensor with shape `(batch_size, features, 1)`
965 """
967 def __init__(self, data_format='channels_last', **kwargs):
968 super(GlobalAveragePooling1D, self).__init__(data_format=data_format,
969 **kwargs)
970 self.supports_masking = True
972 def call(self, inputs, mask=None):
973 steps_axis = 1 if self.data_format == 'channels_last' else 2
974 if mask is not None:
975 mask = math_ops.cast(mask, inputs[0].dtype)
976 mask = array_ops.expand_dims(
977 mask, 2 if self.data_format == 'channels_last' else 1)
978 inputs *= mask
979 return backend.sum(
980 inputs, axis=steps_axis,
981 keepdims=self.keepdims) / math_ops.reduce_sum(
982 mask, axis=steps_axis, keepdims=self.keepdims)
983 else:
984 return backend.mean(inputs, axis=steps_axis, keepdims=self.keepdims)
986 def compute_mask(self, inputs, mask=None):
987 return None
990@keras_export('keras.layers.GlobalMaxPool1D', 'keras.layers.GlobalMaxPooling1D')
991class GlobalMaxPooling1D(GlobalPooling1D):
992 """Global max pooling operation for 1D temporal data.
994 Downsamples the input representation by taking the maximum value over
995 the time dimension.
997 For example:
999 >>> x = tf.constant([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
1000 >>> x = tf.reshape(x, [3, 3, 1])
1001 >>> x
1002 <tf.Tensor: shape=(3, 3, 1), dtype=float32, numpy=
1003 array([[[1.], [2.], [3.]],
1004 [[4.], [5.], [6.]],
1005 [[7.], [8.], [9.]]], dtype=float32)>
1006 >>> max_pool_1d = tf.keras.layers.GlobalMaxPooling1D()
1007 >>> max_pool_1d(x)
1008 <tf.Tensor: shape=(3, 1), dtype=float32, numpy=
1009 array([[3.],
1010 [6.],
1011 [9.], dtype=float32)>
1013 Args:
1014 data_format: A string,
1015 one of `channels_last` (default) or `channels_first`.
1016 The ordering of the dimensions in the inputs.
1017 `channels_last` corresponds to inputs with shape
1018 `(batch, steps, features)` while `channels_first`
1019 corresponds to inputs with shape
1020 `(batch, features, steps)`.
1021 keepdims: A boolean, whether to keep the temporal dimension or not.
1022 If `keepdims` is `False` (default), the rank of the tensor is reduced
1023 for spatial dimensions.
1024 If `keepdims` is `True`, the temporal dimension are retained with
1025 length 1.
1026 The behavior is the same as for `tf.reduce_max` or `np.max`.
1028 Input shape:
1029 - If `data_format='channels_last'`:
1030 3D tensor with shape:
1031 `(batch_size, steps, features)`
1032 - If `data_format='channels_first'`:
1033 3D tensor with shape:
1034 `(batch_size, features, steps)`
1036 Output shape:
1037 - If `keepdims`=False:
1038 2D tensor with shape `(batch_size, features)`.
1039 - If `keepdims`=True:
1040 - If `data_format='channels_last'`:
1041 3D tensor with shape `(batch_size, 1, features)`
1042 - If `data_format='channels_first'`:
1043 3D tensor with shape `(batch_size, features, 1)`
1044 """
1046 def call(self, inputs):
1047 steps_axis = 1 if self.data_format == 'channels_last' else 2
1048 return backend.max(inputs, axis=steps_axis, keepdims=self.keepdims)
1051class GlobalPooling2D(Layer):
1052 """Abstract class for different global pooling 2D layers.
1053 """
1055 def __init__(self, data_format=None, keepdims=False, **kwargs):
1056 super(GlobalPooling2D, self).__init__(**kwargs)
1057 self.data_format = conv_utils.normalize_data_format(data_format)
1058 self.input_spec = InputSpec(ndim=4)
1059 self.keepdims = keepdims
1061 def compute_output_shape(self, input_shape):
1062 input_shape = tensor_shape.TensorShape(input_shape).as_list()
1063 if self.data_format == 'channels_last':
1064 if self.keepdims:
1065 return tensor_shape.TensorShape([input_shape[0], 1, 1, input_shape[3]])
1066 else:
1067 return tensor_shape.TensorShape([input_shape[0], input_shape[3]])
1068 else:
1069 if self.keepdims:
1070 return tensor_shape.TensorShape([input_shape[0], input_shape[1], 1, 1])
1071 else:
1072 return tensor_shape.TensorShape([input_shape[0], input_shape[1]])
1074 def call(self, inputs):
1075 raise NotImplementedError
1077 def get_config(self):
1078 config = {'data_format': self.data_format, 'keepdims': self.keepdims}
1079 base_config = super(GlobalPooling2D, self).get_config()
1080 return dict(list(base_config.items()) + list(config.items()))
1083@keras_export('keras.layers.GlobalAveragePooling2D',
1084 'keras.layers.GlobalAvgPool2D')
1085class GlobalAveragePooling2D(GlobalPooling2D):
1086 """Global average pooling operation for spatial data.
1088 Examples:
1090 >>> input_shape = (2, 4, 5, 3)
1091 >>> x = tf.random.normal(input_shape)
1092 >>> y = tf.keras.layers.GlobalAveragePooling2D()(x)
1093 >>> print(y.shape)
1094 (2, 3)
1096 Args:
1097 data_format: A string,
1098 one of `channels_last` (default) or `channels_first`.
1099 The ordering of the dimensions in the inputs.
1100 `channels_last` corresponds to inputs with shape
1101 `(batch, height, width, channels)` while `channels_first`
1102 corresponds to inputs with shape
1103 `(batch, channels, height, width)`.
1104 It defaults to the `image_data_format` value found in your
1105 Keras config file at `~/.keras/keras.json`.
1106 If you never set it, then it will be "channels_last".
1107 keepdims: A boolean, whether to keep the spatial dimensions or not.
1108 If `keepdims` is `False` (default), the rank of the tensor is reduced
1109 for spatial dimensions.
1110 If `keepdims` is `True`, the spatial dimensions are retained with
1111 length 1.
1112 The behavior is the same as for `tf.reduce_mean` or `np.mean`.
1114 Input shape:
1115 - If `data_format='channels_last'`:
1116 4D tensor with shape `(batch_size, rows, cols, channels)`.
1117 - If `data_format='channels_first'`:
1118 4D tensor with shape `(batch_size, channels, rows, cols)`.
1120 Output shape:
1121 - If `keepdims`=False:
1122 2D tensor with shape `(batch_size, channels)`.
1123 - If `keepdims`=True:
1124 - If `data_format='channels_last'`:
1125 4D tensor with shape `(batch_size, 1, 1, channels)`
1126 - If `data_format='channels_first'`:
1127 4D tensor with shape `(batch_size, channels, 1, 1)`
1128 """
1130 def call(self, inputs):
1131 if self.data_format == 'channels_last':
1132 return backend.mean(inputs, axis=[1, 2], keepdims=self.keepdims)
1133 else:
1134 return backend.mean(inputs, axis=[2, 3], keepdims=self.keepdims)
1137@keras_export('keras.layers.GlobalMaxPool2D', 'keras.layers.GlobalMaxPooling2D')
1138class GlobalMaxPooling2D(GlobalPooling2D):
1139 """Global max pooling operation for spatial data.
1141 Examples:
1143 >>> input_shape = (2, 4, 5, 3)
1144 >>> x = tf.random.normal(input_shape)
1145 >>> y = tf.keras.layers.GlobalMaxPool2D()(x)
1146 >>> print(y.shape)
1147 (2, 3)
1149 Args:
1150 data_format: A string,
1151 one of `channels_last` (default) or `channels_first`.
1152 The ordering of the dimensions in the inputs.
1153 `channels_last` corresponds to inputs with shape
1154 `(batch, height, width, channels)` while `channels_first`
1155 corresponds to inputs with shape
1156 `(batch, channels, height, width)`.
1157 It defaults to the `image_data_format` value found in your
1158 Keras config file at `~/.keras/keras.json`.
1159 If you never set it, then it will be "channels_last".
1160 keepdims: A boolean, whether to keep the spatial dimensions or not.
1161 If `keepdims` is `False` (default), the rank of the tensor is reduced
1162 for spatial dimensions.
1163 If `keepdims` is `True`, the spatial dimensions are retained with
1164 length 1.
1165 The behavior is the same as for `tf.reduce_max` or `np.max`.
1167 Input shape:
1168 - If `data_format='channels_last'`:
1169 4D tensor with shape `(batch_size, rows, cols, channels)`.
1170 - If `data_format='channels_first'`:
1171 4D tensor with shape `(batch_size, channels, rows, cols)`.
1173 Output shape:
1174 - If `keepdims`=False:
1175 2D tensor with shape `(batch_size, channels)`.
1176 - If `keepdims`=True:
1177 - If `data_format='channels_last'`:
1178 4D tensor with shape `(batch_size, 1, 1, channels)`
1179 - If `data_format='channels_first'`:
1180 4D tensor with shape `(batch_size, channels, 1, 1)`
1181 """
1183 def call(self, inputs):
1184 if self.data_format == 'channels_last':
1185 return backend.max(inputs, axis=[1, 2], keepdims=self.keepdims)
1186 else:
1187 return backend.max(inputs, axis=[2, 3], keepdims=self.keepdims)
1190class GlobalPooling3D(Layer):
1191 """Abstract class for different global pooling 3D layers."""
1193 def __init__(self, data_format=None, keepdims=False, **kwargs):
1194 super(GlobalPooling3D, self).__init__(**kwargs)
1195 self.data_format = conv_utils.normalize_data_format(data_format)
1196 self.input_spec = InputSpec(ndim=5)
1197 self.keepdims = keepdims
1199 def compute_output_shape(self, input_shape):
1200 input_shape = tensor_shape.TensorShape(input_shape).as_list()
1201 if self.data_format == 'channels_last':
1202 if self.keepdims:
1203 return tensor_shape.TensorShape(
1204 [input_shape[0], 1, 1, 1, input_shape[4]])
1205 else:
1206 return tensor_shape.TensorShape([input_shape[0], input_shape[4]])
1207 else:
1208 if self.keepdims:
1209 return tensor_shape.TensorShape(
1210 [input_shape[0], input_shape[1], 1, 1, 1])
1211 else:
1212 return tensor_shape.TensorShape([input_shape[0], input_shape[1]])
1214 def call(self, inputs):
1215 raise NotImplementedError
1217 def get_config(self):
1218 config = {'data_format': self.data_format, 'keepdims': self.keepdims}
1219 base_config = super(GlobalPooling3D, self).get_config()
1220 return dict(list(base_config.items()) + list(config.items()))
1223@keras_export('keras.layers.GlobalAveragePooling3D',
1224 'keras.layers.GlobalAvgPool3D')
1225class GlobalAveragePooling3D(GlobalPooling3D):
1226 """Global Average pooling operation for 3D data.
1228 Args:
1229 data_format: A string,
1230 one of `channels_last` (default) or `channels_first`.
1231 The ordering of the dimensions in the inputs.
1232 `channels_last` corresponds to inputs with shape
1233 `(batch, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
1234 while `channels_first` corresponds to inputs with shape
1235 `(batch, channels, spatial_dim1, spatial_dim2, spatial_dim3)`.
1236 It defaults to the `image_data_format` value found in your
1237 Keras config file at `~/.keras/keras.json`.
1238 If you never set it, then it will be "channels_last".
1239 keepdims: A boolean, whether to keep the spatial dimensions or not.
1240 If `keepdims` is `False` (default), the rank of the tensor is reduced
1241 for spatial dimensions.
1242 If `keepdims` is `True`, the spatial dimensions are retained with
1243 length 1.
1244 The behavior is the same as for `tf.reduce_mean` or `np.mean`.
1246 Input shape:
1247 - If `data_format='channels_last'`:
1248 5D tensor with shape:
1249 `(batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
1250 - If `data_format='channels_first'`:
1251 5D tensor with shape:
1252 `(batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)`
1254 Output shape:
1255 - If `keepdims`=False:
1256 2D tensor with shape `(batch_size, channels)`.
1257 - If `keepdims`=True:
1258 - If `data_format='channels_last'`:
1259 5D tensor with shape `(batch_size, 1, 1, 1, channels)`
1260 - If `data_format='channels_first'`:
1261 5D tensor with shape `(batch_size, channels, 1, 1, 1)`
1262 """
1264 def call(self, inputs):
1265 if self.data_format == 'channels_last':
1266 return backend.mean(inputs, axis=[1, 2, 3], keepdims=self.keepdims)
1267 else:
1268 return backend.mean(inputs, axis=[2, 3, 4], keepdims=self.keepdims)
1271@keras_export('keras.layers.GlobalMaxPool3D', 'keras.layers.GlobalMaxPooling3D')
1272class GlobalMaxPooling3D(GlobalPooling3D):
1273 """Global Max pooling operation for 3D data.
1275 Args:
1276 data_format: A string,
1277 one of `channels_last` (default) or `channels_first`.
1278 The ordering of the dimensions in the inputs.
1279 `channels_last` corresponds to inputs with shape
1280 `(batch, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
1281 while `channels_first` corresponds to inputs with shape
1282 `(batch, channels, spatial_dim1, spatial_dim2, spatial_dim3)`.
1283 It defaults to the `image_data_format` value found in your
1284 Keras config file at `~/.keras/keras.json`.
1285 If you never set it, then it will be "channels_last".
1286 keepdims: A boolean, whether to keep the spatial dimensions or not.
1287 If `keepdims` is `False` (default), the rank of the tensor is reduced
1288 for spatial dimensions.
1289 If `keepdims` is `True`, the spatial dimensions are retained with
1290 length 1.
1291 The behavior is the same as for `tf.reduce_max` or `np.max`.
1293 Input shape:
1294 - If `data_format='channels_last'`:
1295 5D tensor with shape:
1296 `(batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
1297 - If `data_format='channels_first'`:
1298 5D tensor with shape:
1299 `(batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)`
1301 Output shape:
1302 - If `keepdims`=False:
1303 2D tensor with shape `(batch_size, channels)`.
1304 - If `keepdims`=True:
1305 - If `data_format='channels_last'`:
1306 5D tensor with shape `(batch_size, 1, 1, 1, channels)`
1307 - If `data_format='channels_first'`:
1308 5D tensor with shape `(batch_size, channels, 1, 1, 1)`
1309 """
1311 def call(self, inputs):
1312 if self.data_format == 'channels_last':
1313 return backend.max(inputs, axis=[1, 2, 3], keepdims=self.keepdims)
1314 else:
1315 return backend.max(inputs, axis=[2, 3, 4], keepdims=self.keepdims)
1318# Aliases
1320AvgPool1D = AveragePooling1D
1321MaxPool1D = MaxPooling1D
1322AvgPool2D = AveragePooling2D
1323MaxPool2D = MaxPooling2D
1324AvgPool3D = AveragePooling3D
1325MaxPool3D = MaxPooling3D
1326GlobalMaxPool1D = GlobalMaxPooling1D
1327GlobalMaxPool2D = GlobalMaxPooling2D
1328GlobalMaxPool3D = GlobalMaxPooling3D
1329GlobalAvgPool1D = GlobalAveragePooling1D
1330GlobalAvgPool2D = GlobalAveragePooling2D
1331GlobalAvgPool3D = GlobalAveragePooling3D