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))
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.]]]]