AvgPool3D

Описание

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) = \frac{1}{k_dk_hk_w}\sum_{t=0}^{k_d-1}\sum_{m=0}^{k_h-1}\sum_{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, 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))