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

Ответы (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 # Добавлять шум только в процессе обучения!
             ):
        if training:
            return inputs + tf.random.normal(
                inputs.shape,
                mean=self.mean,
                stddev=self.stddev
            ) # Добавить случайный шум во время обучения
        else:
            return inputs + tf.fill(
                inputs.shape,
                self.mean
            ) # Добавить среднее значение случайного шума во время вывода

модель = keras.Sequential([
    layers.Flatten(input_shape=(10,10,1)),
    Noise(stddev=.1)
])

model(input_batch,
      training=True # По умолчанию False.
                    # Шум добавляется только в режиме обучения.
)

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

Также существует встроенный слой keras.layers.GaussianNoise, который делает то же самое, что и мой Noise выше.

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

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

Для любого уточнения, пожалуйста, не стесняйтесь комментировать! Будьте здоровы.

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

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

2022 WebDevInsider