Как мне реализовать слой Salt & Pepper в Keras? - PullRequest
1 голос
/ 12 апреля 2019

Мне нужно реализовать слой соли и перца в кератах, таких как гауссовский шум, я пытался использовать следующий код, но он выдает несколько ошибок.не могли бы вы сказать мне, в чем проблема?Есть ли у вас какие-либо другие предложения по внедрению уровня S & P?Спасибо.

from keras.engine.topology import Layer

class SaltAndPepper(Layer):

    def __init__(self, ratio, **kwargs):
        super(SaltAndPepper, self).__init__(**kwargs)
        self.supports_masking = True
        self.ratio = ratio

    def call(self, inputs, training=None):
        def noised():
            r = self.ratio*10
            s = inputs.shape[1]
            n = int( s * r/10 )
            perm = np.random.permutation(r)[:n]
            inputs[perm] = (np.random.rand(n) > 0.5)
            return inputs

        return K.in_train_phase(noised(), inputs, training=training)

    def get_config(self):
        config = {'ratio': self.ratio}
        base_config = super(SaltAndPepper, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

Трассировка (последний последний вызов):

Файл "", строка 125, в decoded_noise = SaltAndPepper (0.5) (декодированный)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ base_layer.py", строка 457, в вызов output = self.call (входные данные, ** kwargs)

Файл "", строка 57, при возврате вызова K.in_train_phase (noised (), входы, обучение = обучение)

Файл "", строка 52, в шуме n =int (s * r / 10)

Ошибка типа: неподдерживаемые типы операндов для /: 'Размер' и 'int'

Обновление:

Я использовал сегодняшнее решение и написал следующий код:

decoded_noise=call(0.05,bncv11)#16

, который bncv11 - это выход уровня пакетной нормализации перед ним.

но выдает эту ошибку, почему это происходит?

Traceback (последний вызов был последним):

File "", строка 59,in decoded_noise = call (0.05, bncv11) # 16

Файл "", строка 34, в вызове return K.in_train_phase (noised (), входы, обучение = обучение)

файл "", строка 29, в зашумленном mask_select = K.random_binomial (shape = shp, p = self.ratio)

AttributeError: у объекта 'float' нет атрибута 'ratio'

послеСохранение модели и ее использование приводит к этой ошибке:

Трассировка (последний последний вызов):

Файл "", строка 1, в b = load_model ('Desktop / los4x4_con_tile_convolw_FBN_SigAct_SandPAttack05.h5',custom_objects = {'tf': tf})

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ save.py", строка 419, в модели load_model= _deserialize_model (f, custom_objects, compile)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ save.py", строка 225, в _deserialize_model model = model_from_config (model_config, custom_objects = custom_objects)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ save.py", строка 458, в model_from_configreturn deserialize (config, custom_objects = custom_objects)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ layer__init __. py", строка 55, в десериализовать printable_module_name = 'layer')

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ utils \ generic_utils.py", строка 145, в списке deserialize_keras_object (custom_objects.items ())))

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", строка 1022, в from_config process_layer (layer_data)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", строка 1008, в файле process_layer custom_objects = custom_objects)

Файл "D: \ software \Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ layer__init __. Py ", строка 55, в десериализованном принтабеle_module_name = 'layer')

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ utils \ generic_utils.py", строка 138, в deserialize_keras_object ':' + class_name)

ValueError: Неизвестный слой: SaltAndPepper

Я поместил этот код в свою программу, где я определяю структуру своей сети:

from keras.engine.topology import Layer

class SaltAndPepper(Layer):

    def __init__(self, ratio, **kwargs):
        super(SaltAndPepper, self).__init__(**kwargs)
        self.supports_masking = True
        self.ratio = ratio

    # the definition of the call method of custom layer
    def call(self, inputs, training=True):
        def noised():
            shp = K.shape(inputs)[1:]
            mask_select = K.random_binomial(shape=shp, p=self.ratio)
            mask_noise = K.random_binomial(shape=shp, p=0.5) # salt and pepper have the same chance
            out = inputs * (1-mask_select) + mask_noise * mask_select
            return out

        return K.in_train_phase(noised(), inputs, training=training)

    def get_config(self):
        config = {'ratio': self.ratio}
        base_config = super(SaltAndPepper, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

При обработке изображений шум соли и перца в основном изменяет значение отношения пикселей, которые выбираются случайным образом, либо к соли (т. Е. К белому, который обычно составляет 1 или 255 в зависимости от диапазона значений изображения), либо к перцу (т.е. черный, который обычно равен 0).Хотя мы можем использовать ту же идею в других областях, кроме обработки изображений.Таким образом, вы должны сначала указать три вещи:

  1. Сколько пикселей нужно изменить?(коэффициент шума)
  2. Какие пиксели должны быть выбраны и изменены?
  3. Какие из этих выбранных пикселей должны быть засолены (а другие поперчены)?

Так какэто функция в бэкэнде Keras для генерации случайных значений из биномиального распределения (т. е. 0 или 1) с заданной вероятностью , мы можем легко выполнить все вышеописанные шаги, сгенерировав две маски: одну для выбора пикселей сзаданное соотношение и другое для применения либо соли или перца к этим выбранным пикселям.Вот как это сделать:

from keras import backend as K

# NOTE: this is the definition of the call method of custom layer class (i.e. SaltAndPepper)
def call(self, inputs, training=None):
    def noised():
        shp = K.shape(inputs)[1:]
        mask_select = K.random_binomial(shape=shp, p=self.ratio)
        mask_noise = K.random_binomial(shape=shp, p=0.5) # salt and pepper have the same chance
        out = inputs * (1-mask_select) + mask_noise * mask_select
        return out

    return K.in_train_phase(noised(), inputs, training=training)

Обратите внимание, что в приведенном выше коде я предположил несколько вещей:

  • Значение данного коэффициента шума находится в диапазоне [0, 1].
  • Если вы используете этот слой для непосредственного нанесения его на изображения, то вы должны заметить, что он предполагает, что изображения имеют оттенки серого (т.е. одноцветный канал).Чтобы использовать его для изображений RGB (т. Е. Трех цветовых каналов), вам может потребоваться немного изменить его, чтобы пиксель со всеми его каналами был выбран для добавления шума (хотя это зависит от того, как вы определяете и используете шум соли и перца).).
  • Предполагается, что значение соли равно 1, а значение перца равно 0. Однако значение соли можно легко изменить на x и перца на y, изменив значениеопределение mask_noise выглядит следующим образом:

    mask_noise = K.random_binomial(shape=shp, p=0.5) * (x-y) + y
    
  • Одна и та же диаграмма шума применяется ко всем выборкам в партии (однако она будет отличаться от партии к партии).

0 голосов
/ 12 апреля 2019

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

библиотека open cv лучше всего подходит для решения такой проблемы, как эта

check: https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_filtering/py_filtering.html

...