Dropout¶
Описание¶
Этот модуль выполняет операцию исключения нейронов (dropout).
Техника 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.]]]]