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