MaxPool3D

Описание

Info

Родительский класс: Pool3D

Производные классы: -

Этот модуль реализует операцию трехмерного максимизирующего пулинга (трехмерного максимизирующего объединения). Подробное теоретическое описание см. в Pool3D.

Для входного тензора с размерами (N, C, D_{in}, H_{in}, W_{in}) и выходного с размерами (N, C, D_{out}, H_{out}, W_{out}) операция проводится следующим образом (рассматриваем i-й элемент батча, j-ую карту выходного тензора):

out(N_i, C_j, d, h, w) = \max\limits_{t=0..k_d-1}\max\limits_{m=0..k_h-1}\max\limits_{n=0..k_w-1}(input(N_i, C_j, stride_d \times d + t, stride_h \times h + m, stride_w \times w + n))

где

N - размер батча;
C - количество карт в тензоре;
H - размер карт по высоте;
W - размер карт по ширине;
stride_d, stride_h, stride_w - шаг пулинга вдоль глубины, высоты и ширины карт соответственно;
k_d, k_h, k_w - размер ядра пулинга по глубине, высоте и ширине соответственно.

Инициализация

def __init__(self, size=2, stride=2, pad=0, name=None):

Параметры

Параметр Возможные типы Описание По умолчанию
size Union[int, tuple] Размер ядра. 2
stride Union[int, tuple] Шаг пулинга. 2
pad Union[int, tuple] Паддинг входных карт. 0
name str Имя слоя. None

Пояснения

size - возможна передача как единого размера ядра пулинга, в таком случае оно будет кубическим, так и tuple вида (size_d, size_h, size_w), где size_d - глубина ядра пулинга, size_h - высота ядра пулинга, а size_w - его ширина;


stride - возможна передача как единой величины шага пулинга вдоль всех осей карт, так и tuple вида (stride_d, stride_h, stride_w), где stride_h - величина шага пулинга вдоль глубины карты, stride_h - величина шага пулинга вдоль высоты карты, а stride_w - вдоль ширины;


pad - возможна передача как единой величины отступа для всех сторон карт, так и tuple вида (pad_d, pad_h, pad_w), где pad_d - величина отступа с каждой стороны вдоль глубины карты, pad_h - вдоль высоты карты, а pad_w - вдоль ширины.


Important

Если задаёте какой-либо из параметров size, stride или pad разным для осей карты, то значения этих параметров должны быть явно переданы в трёхэлементном кортеже, иначе возникнет ошибка.

Примеры


Необходимые импорты.

>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import MaxPool3D

Info

gpuarray необходим для правильного размещения тензора на GPU

Для данного модуля примеры даны в упрощённом варианте. Для более наглядного представления можно взглянуть на примеры MaxPool2D.

>>> batchsize, maps, d, h, w = 1, 1, 6, 6, 6
>>> data = gpuarray.to_gpu(np.random.randn(batchsize, maps, d, h, w).astype(np.float32))

Инициализируем модуль со стандартными параметрами (size=2, stride=2, pad=0):

>>> avgpool = MaxPool3D()
>>> avgpool(data)

Оставим все параметры такими же, кроме size:

>>> pool = MaxPool3D(size=4)
>>> pool(data)

Параметр size можно задавать разным для каждой оси карты:

>>> pool = MaxPool3D(size=(2, 4, 2))
>>> pool(data)

Параметры stride и pad также можно задавать разным для каждой оси карты:

>>> pool = MaxPool3D(size=4, stride=(1, 4, 4), pad=(0, 1, 1))
>>> pool(data)

Как и говорилось ранее, если параметр имеет разные значения для разных осей, то все эти значения должны быть переданы явно. Следующий пример вызовет ошибку:

>>> pool = MaxPool3D(stride=(1, 3))
>>> pool(data)