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
Возьмём нормально распределённый шум и режим суммирования значений шума со значениями данных:
np.random.seed(123)
data = gpuarray.to_gpu(np.random.randint(0, 9, (1, 3, 4, 4)).astype(np.float32))
print(data)
[[[[2. 2. 6. 1.]
[3. 6. 1. 0.]
[1. 0. 0. 3.]
[4. 0. 0. 4.]]
[[1. 7. 3. 2.]
[4. 7. 2. 4.]
[8. 0. 7. 3.]
[4. 6. 1. 5.]]
[[6. 2. 1. 8.]
[3. 5. 0. 2.]
[6. 2. 4. 4.]
[6. 3. 0. 6.]]]]
injector = NoiseInjector(mode="add", noisetype="gaussian", params=(0.0, 10.0))
print(injector(data))
[[[[ -4.3309712 2.08201 16.573734 8.57326 ]
[ 21.06646 3.758148 14.312004 -6.5693135 ]
[ 9.087677 -9.566303 -6.01458 0.16788411]
[ -1.3159542 0.38866973 -11.592874 23.892897 ]]
[[ 3.4345775 8.709841 -4.4099264 11.415678 ]
[ 2.3037925 5.180489 5.9057817 6.890024 ]
[ -9.175585 16.199835 22.050224 9.048243 ]
[ 0.18314695 9.058003 0.78339946 1.8816617 ]]
[[ 13.431959 8.329308 -7.429866 20.178535 ]
[ 5.6269503 2.4493244 4.348013 11.406551 ]
[ 10.589058 21.149744 15.779724 2.0710073 ]
[ 8.479838 12.597048 11.60874 -19.87299 ]]]]
Поменяем распределение на равномерное и выберем режим умножения значений шума на значения данных, причём в этот раз введение шума будет сделано по срезу:
injector = NoiseInjector(mode="mul", noisetype="uniform", params=(0.0, 10.0), slicing = slice(1*2*3*2, 1*3*3*2))
print(injector(data))
[[[[ 2. 2. 6. 1. ]
[ 3. 6. 1. 0. ]
[ 1. 0. 0. 3. ]
[ 6.6883607 0. 0. 36.555717 ]]
[[ 9.848382 65.91567 3. 2. ]
[ 4. 7. 2. 4. ]
[ 8. 0. 7. 3. ]
[ 4. 6. 1. 5. ]]
[[ 6. 2. 1. 8. ]
[ 3. 5. 0. 2. ]
[ 6. 2. 4. 4. ]
[ 6. 3. 0. 6. ]]]]