NoiseInjector

Описание

Info

Родительский класс: Module

Производные классы: -

Данный модуль реализует функцию внесения шума в тензор данных.

Эта операция может применяться как для аугментации данных, так и для повышения устойчивости модели к шуму при обучении на заранее зашумленных данных.

Дополнительные источники

Инициализация

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