MaxUnpool2D¶
Описание¶
Данный модуль вычисляет частичную обратную величину двумерного максимизирующего пулинга MaxPool2D.
Операция пулинга не является полностью обратимой, так как при обработке теряются немаксимальные значения.
Данный модуль принимает в качестве входных данных выходные данные MaxPool2D, включая индексы максимальных значений, и вычисляет частичную инверсию тензора-кандидата, располагая его элементы в выходном тензоре согласно индексам максимальных значений. Все немаксимальные значения нового тензора будут нулевыми.
Инициализация¶
def __init__(self, maxpool2d, name=None):
Параметры
Параметр | Возможные типы | Описание | По умолчанию |
---|---|---|---|
maxpool2d | Module | Экземпляр класса MaxPool2D. | - |
name | str | Имя слоя. | None |
Пояснения
-
Примеры¶
Необходимые импорты.
>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import MaxPool2D, MaxUnpool2D
Info
gpuarray
необходим для правильного размещения тензора на GPU
Для упрощения размер батча и количество карт примем равными 1:
>>> batchsize, maps, h, w = 1, 1, 6, 6
>>> indata = gpuarray.to_gpu(np.random.randint(0, 9, (batchsize, maps, h, w)).astype(np.float32))
>>> print(indata)
[[[[2. 0. 4. 4. 3. 0.]
[0. 4. 2. 3. 3. 0.]
[0. 3. 1. 4. 8. 2.]
[7. 4. 0. 8. 0. 0.]
[2. 6. 2. 2. 4. 3.]
[6. 1. 0. 5. 6. 7.]]]]
Экземпляр класса MaxPool2D
инициализируем с параметрами по умолчанию (size=2
, stride=2
, pad=0
). Как и говорилось выше, экземпляр класса MaxUnpool2D
должен принимать на вход объект MaxPool2D
:
>>> maxpool2d = MaxPool2D()
>>> maxunpool2d = MaxUnpool2D(maxpool2d)
>>> maxpool2d(indata)
[[[[4. 4. 3.]
[7. 8. 8.]
[6. 5. 7.]]]]
Создадим тензор-кандидат и проведём над ним операцию:
>>> data = data = gpuarray.to_gpu(np.random.randint(0, 9, maxpool2d.data.shape).astype(np.float32))
>>> print(data)
[[[[6. 2. 6.]
[1. 3. 1.]
[7. 2. 6.]]]]
>>> maxunpool2d(data)
[[[[0. 0. 2. 0. 6. 0.]
[0. 6. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0.]
[1. 0. 0. 3. 0. 0.]
[0. 7. 0. 0. 0. 0.]
[0. 0. 0. 2. 0. 6.]]]]