Я обнаружил, что во многих доступном коде нейронных сетей, реализованном с использованием TensorFlow, условия регуляризации часто реализуются путем добавления вручную дополнительного члена к значению потерь.
Мои вопросы:
Есть ли более элегантный или рекомендуемый способ регуляризации, чем это делать вручную?
Я также считаю, что
get_variable
у этого есть аргументregularizer
. Как его использовать? По моим наблюдениям, если мы передадим ему регуляризатор (напримерtf.contrib.layers.l2_regularizer
, тензор, представляющий регуляризованный член, будет вычислен и добавлен в коллекцию графов с именемtf.GraphKeys.REGULARIZATOIN_LOSSES
. Будет ли эта коллекция автоматически использоваться TensorFlow (например, оптимизаторами при обучении)? Или ожидается ли, что я буду использовать эту коллекцию самостоятельно?
источник
S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
?Ответы:
Как вы говорите во втором пункте,
regularizer
рекомендуется использовать аргумент. Вы можете использовать егоget_variable
или установить один раз в своемvariable_scope
и упорядочить все свои переменные.Убытки собраны на графике, и вам нужно вручную добавить их к функции затрат, как это.
Надеюсь, это поможет!
источник
reg_constant
может быть необязательно, поскольку регуляризаторы в TensorFlow имеют аргументscale
в своих конструкторах, так что влияние условий reg можно контролировать более детально. И (2) использованиеtf.add_n
может быть немного лучше, чемsum
, я полагаю, использование суммы может создать много тензоров в графике для хранения промежуточного результата.S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
, могу ли я предложить код, который вы предложили? Как вsum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
?tf.reduce_sum
следует использовать вместоsum
?Некоторые аспекты существующего ответа мне не сразу были понятны, поэтому вот пошаговое руководство:
Определите регуляризатор. Здесь можно установить константу регуляризации, например:
Создавать переменные через:
Точно так же переменные можно создавать с помощью обычного
weights = tf.Variable(...)
конструктора, за которым следуетtf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)
.Определите какой-нибудь
loss
термин и добавьте термин регуляризации:Примечание: похоже, что
tf.contrib.layers.apply_regularization
он реализован какAddN
, так что более или менее эквивалентенsum(reg_variables)
.источник
apply_regularization
нет необходимости, если вы уже указали регуляризатор при создании переменной.REGULARIZATION_LOSSES
это полная потеря, возвращаемая регуляризаторами, поэтому вы, по сути, звонитеregularizer(regularizer(weight))
.Я дам простой правильный ответ, так как не нашел. Вам нужно два простых шага, остальное сделает магия тензорного потока:
Добавьте регуляризаторы при создании переменных или слоев:
Добавьте термин регуляризации при определении убытка:
источник
Другой вариант сделать это с
contrib.learn
библиотекой - это следующий вариант , основанный на учебнике Deep MNIST на веб-сайте Tensorflow. Во-первых, если вы импортировали соответствующие библиотеки (например,import tensorflow.contrib.layers as layers
), вы можете определить сеть отдельным методом:Затем в основном методе вы можете использовать следующий фрагмент кода:
Чтобы это заработало, вам нужно следовать руководству MNIST, с которым я связался ранее, и импортировать соответствующие библиотеки, но это хорошее упражнение для изучения TensorFlow, и легко увидеть, как регуляризация влияет на результат. Если вы примените регуляризацию в качестве аргумента, вы увидите следующее:
Обратите внимание, что часть регуляризации дает вам три элемента в зависимости от доступных элементов.
С регуляризациями 0, 0,0001, 0,01 и 1,0 я получаю значения точности теста 0,9468, 0,9476, 0,9183 и 0,1135, соответственно, что показывает опасность высоких условий регуляризации.
источник
Если кто-то еще ищет, я просто хотел бы добавить это в tf.keras, вы можете добавить регуляризацию веса, передав их в качестве аргументов в ваших слоях. Пример добавления регуляризации L2, взятой оптом с сайта Tensorflow Keras Tutorials:
Насколько мне известно, нет необходимости вручную добавлять потери регуляризации с помощью этого метода.
Ссылка: https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#add_weight_regularization
источник
Я проверил
tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
иtf.losses.get_regularization_loss()
с однимl2_regularizer
на графике и обнаружил, что они возвращают одинаковое значение. Наблюдая за количеством значения, я предполагаю, что reg_constant уже имеет смысл в значении, установив параметрtf.contrib.layers.l2_regularizer
.источник
Если у вас есть CNN, вы можете сделать следующее:
В вашей модели функции:
В вашей функции потерь:
источник
Некоторые ответы сбивают меня с толку. Здесь я предлагаю два способа сделать это ясно.
Затем его можно добавить в общую потерю
источник
источник
tf.GraphKeys.REGULARIZATION_LOSSES
не будут добавлены автоматически, но есть простой способ добавить их:tf.losses.get_regularization_loss()
используетсяtf.add_n
для суммирования записейtf.GraphKeys.REGULARIZATION_LOSSES
поэлементно.tf.GraphKeys.REGULARIZATION_LOSSES
обычно представляет собой список скаляров, рассчитанный с использованием функций регуляризатора. Он получает записи из вызовов, дляtf.get_variable
которыхregularizer
указан параметр. Вы также можете добавить в эту коллекцию вручную. Это было бы полезно при использовании,tf.Variable
а также при указании регуляризаторов активности или других настраиваемых регуляризаторов. Например:(В этом примере, по-видимому, было бы более эффективно упорядочить x, поскольку y действительно выравнивается при больших x.)
источник