Dropout

Описание

Info

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

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

Этот модуль выполняет операцию исключения нейронов (dropout).

Техника dropout используется для уменьшения вероятности переобучения модели. Суть метода заключается в том, что в процессе обучения dropout-слой случайным образом обнуляет значения определённого количества элементов входного тензора. На рисунке 1.б схематично продемонстрирован принцип действия модуля (dropout применён к каждому слою).

dropout
Рисунок 1. (а) Обычная нейронная сеть, (б) нейронная сеть с dropout механизмом

Также при использовании техники dropout выход каждого оставшегося нейрона масштабируется в \frac{1}{1 - p} раз, где p - вероятность, с которой исключаются нейроны.

В режиме теста (инференса) dropout механизм отключается.

Дополнительные источники

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

def __init__(self, p=0.5, rng=globalRng, slicing=None, inplace=False, name=None):

Параметры

Параметр Возможные типы Описание По умолчанию
p float Вероятность, с которой исключаются нейроны. 0.5
rng object Объект генератора случайных чисел (бэкендозависимый). globalRng
slicing slice Срез, к которому применяется операция. None
inplace bool Если True, то выходной тензор будет записан в памяти на место входного. False
name str Имя слоя. None

Пояснения

rng - генератор случайных чисел, который зависит от платформы, на которой проводятся расчёты, т.е. генератор бэкендозависимый: например, при использовании Nvidia-GPU и CUDA генератор формируется средствами библиотеки curand;


slicing - срез задаётся через встроенный в python объект slice, причём нужно учитывать, что индексы среза задаются для уплощённого тензора данных;


inplace - флаг, показывающий, нужно ли выделять дополнительные ресурсы памяти для результата. Если True, то выходной тензор будет записан в памяти на место входного, что может негативно отразиться на работе сети, если входной тензор должен принимать участие в расчётах на других ветках графа.

Примеры

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

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

Info

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

Сгенерируем тензор данных. Для простоты количество батчей и карт будут равными 1:

>>> batchsize, maps, h, w = 1, 1, 5, 5
>>> data = gpuarray.to_gpu(np.arange(batchsize * maps * h * w).reshape((batchsize, maps, h, w)).astype(np.float32))
[[[[ 0.  1.  2.  3.  4.]
   [ 5.  6.  7.  8.  9.]
   [10. 11. 12. 13. 14.]
   [15. 16. 17. 18. 19.]
   [20. 21. 22. 23. 24.]]]]

Инициализируем модуль со значениями по умолчанию:

>>> dropout = Dropout()
>>> dropout(data)
[[[[ 0.  0.  4.  6.  8.]
   [ 0. 12. 14.  0.  0.]
   [ 0.  0. 24. 26. 28.]
   [30. 32.  0. 36. 38.]
   [40.  0.  0. 46.  0.]]]]

Установим теперь параметр slicing (обратите внимание, что срез задаём для уплощённой версии тензора data):

>>> dropout = Dropout(slicing=slice((h * w) // 2, h * w))
>>> dropout(data)
[[[[ 0.  1.  2.  3.  4.]
   [ 5.  6.  7.  8.  9.]
   [10. 11. 24. 26.  0.]
   [30.  0. 34.  0. 38.]
   [ 0. 42.  0. 46. 48.]]]]