Pad2D

Описание

Info

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

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

Данный модуль реализует операцию двумерного паддинга.

Операция паддинга применяется вместе со сверточными слоями нейронных сетей: при паддинге по периметру тензора данных добавляются определённые пользователем констант определённым способом (см. параметр mode), в результате вокруг оригинальных данных образуется прослойка из элементов паддинга.

Это может использоваться, например, для того, чтобы после свёртки сохранился размер карт.

Существует несколько способов задать эту операцию, в библиотеке реализованы следующие:

  • заполнение константным значением;
  • заполнение отражением последнего элемента.

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

def __init__(self, pad, mode="constant", fillValue=None, name=None):

Параметры

Параметр Возможные типы Описание По умолчанию
pad tuple Кортеж бинарных флагов, показывающий с каких сторон следует применять операцию, а с каких - нет. -
mode str Режим заполнения. Возможные значения: "constant", "reflect". "constant"
fillValue float Заполняемое значение при режиме "constant". None
name str Имя слоя. None

Пояснения

pad - кортеж имеет вид (top, bottom, left, right), где вместо обозначения стороны ставится количество дополнительных элементов для соответствующий стороны. Например, (1, 0, 1, 0) значит, что требуется добавить одну строку сверху и один столбец слева.

Примеры

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

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

Info

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

>>> batchsize, maps, h, w = 1, 1, 5, 5
>>> np.random.seed(1234)
>>> data = gpuarray.to_gpu(np.random.randint(1, 10, (batchsize, maps, h, w)).astype(np.float32))
>>> print(data)
[[[[4. 7. 6. 5. 9.]
   [2. 8. 7. 9. 1.]
   [6. 1. 7. 3. 1.]
   [6. 3. 7. 4. 8.]
   [1. 1. 4. 3. 4.]]]]

Добавим по 1 дополнительному слою сверху и слева в режиме "constant":

>>> padmod = Pad2D(pad=(1, 0, 1, 0))
>>> padmod(data)
[[[[0. 0. 0. 0. 0. 0.]
   [0. 4. 7. 6. 5. 9.]
   [0. 2. 8. 7. 9. 1.]
   [0. 6. 1. 7. 3. 1.]
   [0. 6. 3. 7. 4. 8.]
   [0. 1. 1. 4. 3. 4.]]]]

Поменяем режим на "reflect" и добавим паддинг справа и снизу:

>>> padmod = Pad2D(pad=(0, 2, 0, 2), mode="reflect")
>>> padmod(data)
[[[[4. 7. 6. 5. 9. 5. 6.]
   [2. 8. 7. 9. 1. 9. 7.]
   [6. 1. 7. 3. 1. 3. 7.]
   [6. 3. 7. 4. 8. 4. 7.]
   [1. 1. 4. 3. 4. 3. 4.]
   [6. 3. 7. 4. 8. 4. 7.]
   [6. 1. 7. 3. 1. 3. 7.]]]]