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.
np.random.seed(123)
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()
print(pool(data))
Оставим все параметры такими же, кроме size
:
pool = AvgPool3D(size=4)
print(pool(data))
Параметр size
можно задавать разным для каждой оси карты:
pool = AvgPool3D(size=(2, 4, 2))
print(pool(data))
Параметры stride
и pad
также можно задавать разным для каждой оси карты:
pool = AvgPool3D(size=4, stride=(1, 4, 4), pad=(0, 1, 1))
print(pool(data))
Как и говорилось ранее, если параметр имеет разные значения для разных осей, то все эти значения должны быть переданы явно. Следующий пример вызовет ошибку:
pool = AvgPool3D(stride=(1, 3))
print(pool(data))