AvgPool3D¶
Описание¶
Этот модуль реализует операцию трехмерного усредняющего пулинга (трехмерного усредняющего объединения). Подробное теоретическое описание см. в Pool3D.
Для входного тензора с размерами (N, C, D_{in}, H_{in}, W_{in}) и выходного с размерами (N, C, D_{out}, H_{out}, W_{out}) операция проводится следующим образом (рассматриваем i-й элемент батча, j-ую карту выходного тензора):
где
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, includePad=True, name=None):
Параметры
Параметр | Возможные типы | Описание | По умолчанию |
---|---|---|---|
size | Union[int, tuple] | Размер ядра. | 2 |
stride | Union[int, tuple] | Шаг пулинга. | 2 |
pad | Union[int, tuple] | Паддинг входных карт. | 0 |
includePad | bool | Флаг учета значений заполнения краёв при подсчете среднего значения. | True |
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
разным для осей карты, то значения этих параметров должны быть явно переданы в трёхэлементном кортеже, иначе возникнет ошибка.
includePad
- если параметр pad
был задан ненулевым и к исходному тензору по краям были добавлены новые элементы, то при поднятом includePad
их значения также будут оказывать влияние на результат операции пулинга.
Примеры¶
Необходимые импорты.
>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import AvgPool3D
Info
gpuarray
необходим для правильного размещения тензора на GPU
Для данного модуля примеры даны в упрощённом варианте. Для более наглядного представления можно взглянуть на примеры AvgPool2D.
>>> 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
, includePad=True
):
>>> pool = AvgPool3D()
>>> pool(data)
Оставим все параметры такими же, кроме size
:
>>> pool = AvgPool3D(size=4)
>>> pool(data)
Параметр size
можно задавать разным для каждой оси карты:
>>> pool = AvgPool3D(size=(2, 4, 2))
>>> pool(data)
Параметры stride
и pad
также можно задавать разным для каждой оси карты:
>>> pool = AvgPool3D(size=4, stride=(1, 4, 4), pad=(0, 1, 1))
>>> pool(data)
Как и говорилось ранее, если параметр имеет разные значения для разных осей, то все эти значения должны быть переданы явно. Следующий пример вызовет ошибку:
>>> pool = AvgPool3D(stride=(1, 3))
>>> pool(data)