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

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.""" 

16 

17import functools 

18 

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 

28 

29 

30class Pooling1D(Layer): 

31 """Pooling layer for arbitrary pooling functions, for 1D inputs. 

32 

33 This class only exists for code reuse. It will never be an exposed API. 

34 

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 """ 

52 

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) 

67 

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) 

78 

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]) 

95 

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())) 

105 

106 

107@keras_export('keras.layers.MaxPool1D', 'keras.layers.MaxPooling1D') 

108class MaxPooling1D(Pooling1D): 

109 """Max pooling operation for 1D temporal data. 

110 

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)` 

115 

116 The resulting output shape when using the `"same"` padding option is: 

117 `output_shape = input_shape / strides` 

118 

119 For example, for `strides=1` and `padding="valid"`: 

120 

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)> 

131 

132 For example, for `strides=2` and `padding="valid"`: 

133 

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)> 

142 

143 For example, for `strides=1` and `padding="same"`: 

144 

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)> 

156 

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)`. 

173 

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)`. 

179 

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 """ 

186 

187 def __init__(self, pool_size=2, strides=None, 

188 padding='valid', data_format='channels_last', **kwargs): 

189 

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) 

197 

198 

199@keras_export('keras.layers.AveragePooling1D', 'keras.layers.AvgPool1D') 

200class AveragePooling1D(Pooling1D): 

201 """Average pooling for temporal data. 

202 

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)` 

207 

208 The resulting output shape when using the "same" padding option is: 

209 `output_shape = input_shape / strides` 

210 

211 For example, for strides=1 and padding="valid": 

212 

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)> 

230 

231 For example, for strides=2 and padding="valid": 

232 

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)> 

248 

249 For example, for strides=1 and padding="same": 

250 

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)> 

269 

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)`. 

286 

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)`. 

292 

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 """ 

299 

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) 

309 

310 

311class Pooling2D(Layer): 

312 """Pooling layer for arbitrary pooling functions, for 2D inputs (e.g. images). 

313 

314 This class only exists for code reuse. It will never be an exposed API. 

315 

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 """ 

335 

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) 

350 

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 

365 

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]]) 

384 

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())) 

394 

395 

396@keras_export('keras.layers.MaxPool2D', 'keras.layers.MaxPooling2D') 

397class MaxPooling2D(Pooling2D): 

398 """Max pooling operation for 2D spatial data. 

399 

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. 

404 

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`) 

410 

411 The resulting output shape when using the `"same"` padding option is: 

412 `output_shape = math.floor((input_shape - 1) / strides) + 1` 

413 

414 For example, for `strides=(1, 1)` and `padding="valid"`: 

415 

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)> 

428 

429 For example, for `strides=(2, 2)` and `padding="valid"`: 

430 

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)> 

441 

442 Usage Example: 

443 

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) 

459 

460 For example, for stride=(1, 1) and padding="same": 

461 

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)> 

479 

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". 

503 

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)`. 

509 

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)`. 

515 

516 Returns: 

517 A tensor of rank 4 representing the maximum pooled values. See above for 

518 output shape. 

519 """ 

520 

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) 

531 

532 

533@keras_export('keras.layers.AveragePooling2D', 'keras.layers.AvgPool2D') 

534class AveragePooling2D(Pooling2D): 

535 """Average pooling operation for spatial data. 

536 

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. 

541 

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`) 

546 

547 The resulting output shape when using the `"same"` padding option is: 

548 `output_shape = math.floor((input_shape - 1) / strides) + 1` 

549 

550 For example, for `strides=(1, 1)` and `padding="valid"`: 

551 

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)> 

564 

565 For example, for `stride=(2, 2)` and `padding="valid"`: 

566 

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)> 

577 

578 For example, for `strides=(1, 1)` and `padding="same"`: 

579 

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)> 

597 

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". 

621 

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)`. 

627 

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 """ 

634 

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) 

645 

646 

647class Pooling3D(Layer): 

648 """Pooling layer for arbitrary pooling functions, for 3D inputs. 

649 

650 This class only exists for code reuse. It will never be an exposed API. 

651 

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 """ 

673 

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) 

688 

689 def call(self, inputs): 

690 pool_shape = (1,) + self.pool_size + (1,) 

691 strides = (1,) + self.strides + (1,) 

692 

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)) 

698 

699 outputs = self.pool_function( 

700 inputs, 

701 ksize=pool_shape, 

702 strides=strides, 

703 padding=self.padding.upper()) 

704 

705 if self.data_format == 'channels_first': 

706 outputs = array_ops.transpose(outputs, (0, 4, 1, 2, 3)) 

707 return outputs 

708 

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]]) 

731 

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())) 

741 

742 

743@keras_export('keras.layers.MaxPool3D', 'keras.layers.MaxPooling3D') 

744class MaxPooling3D(Pooling3D): 

745 """Max pooling operation for 3D data (spatial or spatio-temporal). 

746 

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. 

751 

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". 

771 

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)` 

779 

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)` 

787 

788 Example: 

789 

790 ```python 

791 depth = 30 

792 height = 30 

793 width = 30 

794 input_channels = 3 

795 

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 """ 

801 

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) 

812 

813 

814@keras_export('keras.layers.AveragePooling3D', 'keras.layers.AvgPool3D') 

815class AveragePooling3D(Pooling3D): 

816 """Average pooling operation for 3D data (spatial or spatio-temporal). 

817 

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. 

822 

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". 

842 

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)` 

850 

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)` 

858 

859 Example: 

860 

861 ```python 

862 depth = 30 

863 height = 30 

864 width = 30 

865 input_channels = 3 

866 

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 """ 

872 

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) 

883 

884 

885class GlobalPooling1D(Layer): 

886 """Abstract class for different global pooling 1D layers.""" 

887 

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 

893 

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]]) 

906 

907 def call(self, inputs): 

908 raise NotImplementedError 

909 

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())) 

914 

915 

916@keras_export('keras.layers.GlobalAveragePooling1D', 

917 'keras.layers.GlobalAvgPool1D') 

918class GlobalAveragePooling1D(GlobalPooling1D): 

919 """Global average pooling operation for temporal data. 

920 

921 Examples: 

922 

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) 

928 

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`. 

943 

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). 

948 

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)` 

956 

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 """ 

966 

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 

971 

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) 

985 

986 def compute_mask(self, inputs, mask=None): 

987 return None 

988 

989 

990@keras_export('keras.layers.GlobalMaxPool1D', 'keras.layers.GlobalMaxPooling1D') 

991class GlobalMaxPooling1D(GlobalPooling1D): 

992 """Global max pooling operation for 1D temporal data. 

993 

994 Downsamples the input representation by taking the maximum value over 

995 the time dimension. 

996 

997 For example: 

998 

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)> 

1012 

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`. 

1027 

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)` 

1035 

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 """ 

1045 

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) 

1049 

1050 

1051class GlobalPooling2D(Layer): 

1052 """Abstract class for different global pooling 2D layers. 

1053 """ 

1054 

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 

1060 

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]]) 

1073 

1074 def call(self, inputs): 

1075 raise NotImplementedError 

1076 

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())) 

1081 

1082 

1083@keras_export('keras.layers.GlobalAveragePooling2D', 

1084 'keras.layers.GlobalAvgPool2D') 

1085class GlobalAveragePooling2D(GlobalPooling2D): 

1086 """Global average pooling operation for spatial data. 

1087 

1088 Examples: 

1089 

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) 

1095 

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`. 

1113 

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)`. 

1119 

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 """ 

1129 

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) 

1135 

1136 

1137@keras_export('keras.layers.GlobalMaxPool2D', 'keras.layers.GlobalMaxPooling2D') 

1138class GlobalMaxPooling2D(GlobalPooling2D): 

1139 """Global max pooling operation for spatial data. 

1140 

1141 Examples: 

1142 

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) 

1148 

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`. 

1166 

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)`. 

1172 

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 """ 

1182 

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) 

1188 

1189 

1190class GlobalPooling3D(Layer): 

1191 """Abstract class for different global pooling 3D layers.""" 

1192 

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 

1198 

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]]) 

1213 

1214 def call(self, inputs): 

1215 raise NotImplementedError 

1216 

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())) 

1221 

1222 

1223@keras_export('keras.layers.GlobalAveragePooling3D', 

1224 'keras.layers.GlobalAvgPool3D') 

1225class GlobalAveragePooling3D(GlobalPooling3D): 

1226 """Global Average pooling operation for 3D data. 

1227 

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`. 

1245 

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)` 

1253 

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 """ 

1263 

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) 

1269 

1270 

1271@keras_export('keras.layers.GlobalMaxPool3D', 'keras.layers.GlobalMaxPooling3D') 

1272class GlobalMaxPooling3D(GlobalPooling3D): 

1273 """Global Max pooling operation for 3D data. 

1274 

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`. 

1292 

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)` 

1300 

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 """ 

1310 

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) 

1316 

1317 

1318# Aliases 

1319 

1320AvgPool1D = AveragePooling1D 

1321MaxPool1D = MaxPooling1D 

1322AvgPool2D = AveragePooling2D 

1323MaxPool2D = MaxPooling2D 

1324AvgPool3D = AveragePooling3D 

1325MaxPool3D = MaxPooling3D 

1326GlobalMaxPool1D = GlobalMaxPooling1D 

1327GlobalMaxPool2D = GlobalMaxPooling2D 

1328GlobalMaxPool3D = GlobalMaxPooling3D 

1329GlobalAvgPool1D = GlobalAveragePooling1D 

1330GlobalAvgPool2D = GlobalAveragePooling2D 

1331GlobalAvgPool3D = GlobalAveragePooling3D