Skip to content

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

Возьмём нормально распределённый шум и режим суммирования значений шума со значениями данных:

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