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))
print(data)
[[[[ 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()
print(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))
print(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.]]]]