Encontré en muchos códigos de redes neuronales disponibles implementados con TensorFlow que los términos de regularización a menudo se implementan agregando manualmente un término adicional al valor de pérdida.
Mis preguntas son:
¿Existe una forma de regularización más elegante o recomendada que hacerlo manualmente?
También encuentro que
get_variable
tiene un argumentoregularizer
. ¿Cómo debe usarse? Según mi observación, si le pasamos un regularizador (comotf.contrib.layers.l2_regularizer
, por ejemplo , se calculará un tensor que representa un término regularizado y se agregará a una colección de gráficos denominadatf.GraphKeys.REGULARIZATOIN_LOSSES
. ¿TensorFlow usará esa colección automáticamente (por ejemplo, los optimizadores durante el entrenamiento)? O ¿Se espera que use esa colección yo solo?
fuente
S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
?Respuestas:
Como dice en el segundo punto, usar el
regularizer
argumento es la forma recomendada. Puede usarloget_variable
o configurarlo una vez en suvariable_scope
y regularizar todas sus variables.Las pérdidas se recopilan en el gráfico y debe agregarlas manualmente a su función de costos de esta manera.
¡Espero que ayude!
fuente
reg_constant
podría no ser necesario, ya que los regularizadores en TensorFlow tienen un argumentoscale
en sus constructores para que el impacto de los términos reg se pueda controlar de una manera más detallada. Y (2) usartf.add_n
podría ser un poco mejor quesum
, supongo que usar sum podría crear muchos tensores en el gráfico para almacenar el resultado intermedio.S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
, ¿tengo el código que sugieres? ¿Como ensum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
?tf.reduce_sum
debería usarse en lugar desum
?Algunos aspectos de la respuesta existente no me quedaron claros de inmediato, por lo que aquí hay una guía paso a paso:
Defina un regularizador. Aquí es donde se puede establecer la constante de regularización, por ejemplo:
Crea variables a través de:
De manera equivalente, las variables se pueden crear mediante el
weights = tf.Variable(...)
constructor regular , seguido detf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)
.Defina algún
loss
término y agregue el término de regularización:Nota: Parece que
tf.contrib.layers.apply_regularization
se implementa como unAddN
, por lo que es más o menos equivalente asum(reg_variables)
.fuente
apply_regularization
no debería ser necesario si ya especificó el regularizador al crear la variable.REGULARIZATION_LOSSES
es la pérdida total devuelta por los regularizadores, por lo que básicamente está llamandoregularizer(regularizer(weight))
.Daré una respuesta simple y correcta ya que no encontré ninguna. Necesita dos pasos simples, el resto se realiza mediante tensorflow magic:
Agregue regularizadores al crear variables o capas:
Agregue el término de regularización al definir la pérdida:
fuente
Otra opción para hacer esto con la
contrib.learn
biblioteca es la siguiente, basada en el tutorial Deep MNIST en el sitio web de Tensorflow. Primero, asumiendo que ha importado las bibliotecas relevantes (comoimport tensorflow.contrib.layers as layers
), puede definir una red en un método separado:Luego, en un método principal, puede usar el siguiente fragmento de código:
Para que esto funcione, debe seguir el tutorial de MNIST que vinculé anteriormente e importar las bibliotecas relevantes, pero es un buen ejercicio para aprender TensorFlow y es fácil ver cómo la regularización afecta la salida. Si aplica una regularización como argumento, puede ver lo siguiente:
Tenga en cuenta que la parte de regularización le ofrece tres elementos, según los elementos disponibles.
Con regularizaciones de 0, 0.0001, 0.01 y 1.0, obtengo valores de precisión de prueba de 0.9468, 0.9476, 0.9183 y 0.1135, respectivamente, que muestran los peligros de los términos de alta regularización.
fuente
Si alguien todavía está buscando, me gustaría agregar que en tf.keras puede agregar regularización de peso pasándolos como argumentos en sus capas. Un ejemplo de cómo agregar regularización L2 tomado al por mayor del sitio de tutoriales de Tensorflow Keras:
Hasta donde yo sé, no hay necesidad de agregar manualmente las pérdidas de regularización con este método.
Referencia: https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#add_weight_regularization
fuente
Probé
tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
ytf.losses.get_regularization_loss()
con unol2_regularizer
en el gráfico, y descubrí que devuelven el mismo valor. Al observar la cantidad del valor, supongo que reg_constant ya tiene sentido en el valor al establecer el parámetro detf.contrib.layers.l2_regularizer
.fuente
Si tiene CNN, puede hacer lo siguiente:
En la función de su modelo:
En su función de pérdida:
fuente
Algunas respuestas me confunden más, aquí les doy dos métodos para que quede claro.
Luego, se puede agregar a la pérdida total
fuente
fuente
tf.GraphKeys.REGULARIZATION_LOSSES
no se agregarán automáticamente, pero hay una forma sencilla de agregarlos:tf.losses.get_regularization_loss()
utilizatf.add_n
para sumar las entradas detf.GraphKeys.REGULARIZATION_LOSSES
elemento.tf.GraphKeys.REGULARIZATION_LOSSES
Normalmente será una lista de escalares, calculada mediante funciones de regularizador. Obtiene entradas de llamadas atf.get_variable
que tienen elregularizer
parámetro especificado. También puede agregar a esa colección manualmente. Eso sería útil al usartf.Variable
y también al especificar regularizadores de actividad u otros regularizadores personalizados. Por ejemplo:(En este ejemplo, presumiblemente sería más efectivo regularizar x, ya que y realmente se aplana para x grande).
fuente