Определение настраиваемого слоя Keras, который добавляет случайное значение к выводу плоского слоя

Как определить настраиваемый слой Keras для добавления случайного значения к выходу слоя Flatten (CNN) размера (None, 100)?


person cuser    schedule 01.01.2021    source источник
comment
Я думаю, вам просто нужен tensorflow.org/api_docs/python/tf/keras / Layers / GaussianNoise   -  person Marco Cerliani    schedule 01.01.2021


Ответы (2)


TL;DR:

class Noise(keras.layers.Layer):
    def __init__(self, mean=0, stddev=1.0, *args, **kwargs):
        super(Noise, self).__init__(*args, **kwargs)
        self.mean = mean
        self.stddev = stddev

    def call(self, inputs, 
             training=False # Only add noise in training!
             ):
        if training:
            return inputs + tf.random.normal(
                inputs.shape, 
                mean=self.mean,
                stddev=self.stddev
            ) # Add random noise during training
        else:
            return inputs + tf.fill(
                inputs.shape, 
                self.mean
            ) # Add mean of random noise during inference

model = keras.Sequential([
    layers.Flatten(input_shape=(10,10,1)),
    Noise(stddev=.1)
])

model(input_batch,
      training=True # Defaults to False. 
                    # Noise is added only in training mode.
) 

Полный пример.

Существует также встроенный слой keras.layers.GaussianNoise, который выполняет те же функции, что и мой Noise выше.

При реализации приведенного выше кода следует иметь в виду несколько примечаний:

  • Если вы намерены использовать случайный шум в качестве регуляризатора для борьбы с переобучением, это намного, намного лучше использовать встроенный модуль увеличения изображения keras.
  • Избегайте использования ненормальных распределений при работе с CNN. Использование равномерного распределения, например, приведет к смещению среднего значения пакета, отрицая всю нормализацию изображений, в которой CNN так отчаянно нуждаются .
  • Рассмотрите возможность использования исключения, если результаты выравнивания передаются в плотные классификаторы наверху. Отказ от учебы намного эффективнее в том, что вы, вероятно, пытаетесь сделать.

Для любых разъяснений, пожалуйста, не стесняйтесь комментировать! Ваше здоровье.

person tornikeo    schedule 01.01.2021
comment
@MarcoCerliani Я знаю, это бросается в глаза. Вопрос был конкретно о «настраиваемом слое». Поэтому я воздержался от комментариев о том, что есть keras.layers.GaussianNoise, который делает то же самое. Если автору нужен собственный слой, это один из способов сделать это. - person tornikeo; 01.01.2021
comment
Это будет предвзятым во время вывода. Если training=True, вы должны добавить среднее значение шума: inputs + tf.fill(inputs.shape, value=self.mean) - person Nicolas Gervais; 01.01.2021
comment
И я считаю, что ваш список выходит за рамки этого вопроса - person Nicolas Gervais; 01.01.2021
comment
@NicolasGervais Я полагаю, вы имели в виду, если training=False, вы должны добавить ..., я прав? Не могли бы вы также процитировать любую статью или подробное объяснение того, почему я должен добавлять среднее значение шума во время вывода? - person tornikeo; 01.01.2021
comment
Да, вы абсолютно правы, спасибо за внимание. Я имел в виду, если training=False. Как и при пакетной нормализации, вам нужно репрезентативное значение во время тестирования. Если ваш шум имел среднее значение M во время обучения и среднее значение 0 во время логического вывода, все будет отключено на M. Это можно решить, установив self.mean = 0. - person Nicolas Gervais; 01.01.2021
comment
Спасибо, теперь это имеет смысл. Dropout также использует для той же цели масштабирование ввода во время вывода. - person tornikeo; 01.01.2021

Попробуй это:

class add_random(tf.keras.layers.Layer):
  def call(self, input):
    return input + tf.random.uniform((1,))
person Andrey    schedule 01.01.2021