NoiseInjector¶
Описание¶
Данный модуль реализует функцию внесения шума в тензор данных.
Эта операция может применяться как для аугментации данных, так и для повышения устойчивости модели к шуму при обучении на заранее зашумленных данных.
Дополнительные источники¶
Инициализация¶
def __init__(self, mode="add", noisetype="uniform", params=(0.0, 1.0), rng=globalRng, inplace=False, slicing=None,
name=None):
Параметры
Параметр | Возможные типы | Описание | По умолчанию |
---|---|---|---|
mode | str | Режим добавления шума. | "add" |
noisetype | str | Тип шума. | "uniform" |
params | tuple | Параметры модели шума. | (0.0, 1.0) |
rng | str | Объект генератора случайных чисел (бэкендозависимый). | globalRng |
inplace | bool | Если True, то выходной тензор будет записан в памяти на место входного. | False |
slicing | slice | Срез, к которому применяется операция. | None |
name | str | Имя слоя. | None |
Пояснения
mode
- режим добавления шума. Может принимать значения "add" и "mul";
noisetype
- тип добавляемого шума. Может принимать значения "gaussian" и "uniform";
rng
- генератор случайных чисел, который зависит от платформы, на которой проводятся расчёты, т.е. генератор бэкендозависимый: например, при использовании Nvidia-GPU и CUDA генератор формируется средствами библиотеки curand;
params
- кортеж параметров шума: (a, b)
для "uniform" и (mean, sigma)
для "gaussian";
inplace
- флаг, показывающий, нужно ли выделять дополнительные ресурсы памяти для результата. Если True, то выходной тензор будет записан в памяти на место входного, что может негативно отразиться на работе сети, если входной тензор должен принимать участие в расчётах на других ветках графа;
slicing
- срез задаётся через встроенный в python объект slice, причём нужно учитывать, что индексы среза задаются для уплощённого тензора данных.
Примеры¶
Необходимые импорты.
>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import NoiseInjector
Info
gpuarray
необходим для правильного размещения тензора на GPU
Возьмём нормально распределённый шум и режим суммирования значений шума со значениями данных:
>>> data = gpuarray.to_gpu(np.random.randint(0, 9, (1, 3, 4, 4)).astype(np.float32))
>>> print(data)
[[[[6. 6. 1. 2. 6.]
[3. 6. 8. 2. 0.]
[0. 5. 4. 1. 6.]
[5. 6. 1. 3. 6.]
[4. 1. 8. 0. 0.]]
[[6. 5. 6. 2. 5.]
[8. 6. 5. 1. 8.]
[1. 7. 4. 2. 6.]
[1. 5. 0. 4. 0.]
[0. 8. 4. 6. 8.]]
[[6. 3. 8. 4. 0.]
[7. 6. 4. 8. 3.]
[5. 1. 4. 1. 1.]
[0. 8. 2. 7. 2.]
[1. 6. 6. 3. 3.]]]]
>>> injector = NoiseInjector(mode="add", noisetype="gaussian", params=(0.0, 10.0))
>>> injector(data)
[[[[ 18.497967 -1.3347244 8.175358 15.437071 -17.020744 ]
[ 11.160535 3.7274754 11.790724 -9.220343 -6.3753014 ]
[ 10.79629 7.2404356 -4.88393 -1.1487608 -4.7226696 ]
[ 5.569405 -2.0390673 -3.3565602 7.963166 23.643564 ]
[ 9.449907 -3.11933 32.06887 -13.164926 3.550262 ]]
[[ 22.858295 13.527686 38.052925 -4.5417457 8.245185 ]
[ 14.954709 9.224528 13.953817 -12.6050415 11.85663 ]
[ 7.456253 6.77518 20.842493 -3.251524 12.892044 ]
[ -2.5932856 -3.0917072 -6.9652996 -5.3049097 -8.3553 ]
[ -4.171719 4.9545865 -2.510837 17.864025 10.528694 ]]
[[ 3.267301 -3.414236 1.7571855 10.906286 -8.430187 ]
[ 9.859923 -2.7999115 -5.892701 0.3149557 6.6246815 ]
[ 16.78846 5.6055384 7.293224 -4.111868 -3.1974878 ]
[ 16.031277 25.708433 11.264681 13.54818 -3.769538 ]
[ -0.14206207 11.421783 5.7146792 3.774578 3.6769433 ]]]]
Поменяем распределение на равномерное и выберем режим умножения значений шума на значения данных, причём в этот раз введение шума будет сделано по срезу:
>>> injector = NoiseInjector(mode="mul", noisetype="uniform", params=(0.0, 10.0), slicing = slice(2 * 4 * 5, 3 * 5 * 5))
>>> injector(data)
[[[[ 6. 6. 1. 2. 6. ]
[ 3. 6. 8. 2. 0. ]
[ 0. 5. 4. 1. 6. ]
[ 5. 6. 1. 3. 6. ]
[ 4. 1. 8. 0. 0. ]]
[[ 6. 5. 6. 2. 5. ]
[ 8. 6. 5. 1. 8. ]
[ 1. 7. 4. 2. 6. ]
[ 1. 5. 0. 4. 0. ]
[ 0. 8. 4. 6. 8. ]]
[[14.204256 7.9821568 30.882828 33.621254 0. ]
[43.150726 55.367523 4.522502 49.947643 3.107901 ]
[35.815884 8.865577 23.082764 1.0058062 5.334869 ]
[ 0. 22.528423 16.319548 31.362062 15.041352 ]
[ 7.672563 19.278425 40.095898 17.783966 8.885609 ]]]]