Pad2D¶
Описание¶
Данный модуль реализует операцию двумерного паддинга.
Операция паддинга применяется вместе со сверточными слоями нейронных сетей: при паддинге по периметру тензора данных добавляются заданные пользователем константы определённым способом (см. параметр 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))
print(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")
print(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.]]]]