Descobri em muitos códigos de rede neural disponíveis implementados usando o TensorFlow que os termos de regularização são frequentemente implementados adicionando manualmente um termo adicional ao valor de perda.
Minhas perguntas são:
Existe uma maneira mais elegante ou recomendada de regularização do que manualmente?
Eu também acho que isso
get_variable
tem um argumentoregularizer
. Como deve ser usado? De acordo com minha observação, se passarmos um regularizador para ele (comotf.contrib.layers.l2_regularizer
um tensor que representa o termo regularizado será calculado e adicionado a uma coleção de gráficos chamadatf.GraphKeys.REGULARIZATOIN_LOSSES
. Essa coleção será usada automaticamente pelo TensorFlow (por exemplo, usada por otimizadores durante o treinamento)? é esperado que eu use essa coleção sozinho?
fonte
S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
?Respostas:
Como você disse no segundo ponto, usar o
regularizer
argumento é a forma recomendada. Você pode usá-lo emget_variable
ou configurá-lo uma vez em seuvariable_scope
e regularizar todas as suas variáveis.As perdas são coletadas no gráfico e você precisa adicioná-las manualmente à sua função de custo desta forma.
Espero que ajude!
fonte
reg_constant
pode não ser necessário, já que os regularizadores no TensorFlow têm um argumentoscale
em seus construtores para que o impacto dos termos de registro possa ser controlado de maneira mais refinada. E (2) usartf.add_n
pode ser um pouco melhor do quesum
, acho que usar soma pode criar muitos tensores no gráfico para armazenar o resultado intermediário.S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
, faço o código que você sugeriu? Como emsum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
?tf.reduce_sum
deve ser usado em vez desum
?Alguns aspectos da resposta existente não ficaram imediatamente claros para mim, então aqui está um guia passo a passo:
Defina um regularizador. É aqui que a constante de regularização pode ser definida, por exemplo:
Crie variáveis por meio de:
De forma equivalente, as variáveis podem ser criadas por meio do
weights = tf.Variable(...)
construtor regular , seguido portf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)
.Defina algum
loss
termo e adicione o termo de regularização:Observação: parece que
tf.contrib.layers.apply_regularization
está implementado como umAddN
, portanto, mais ou menos equivalente asum(reg_variables)
.fonte
apply_regularization
não deve ser necessário se você já especificou o regularizador ao criar a variável.REGULARIZATION_LOSSES
é a perda total retornada dos regularizadores, então você está essencialmente ligandoregularizer(regularizer(weight))
.Vou dar uma resposta correta simples, pois não encontrei nenhuma. Você precisa de duas etapas simples, o resto é feito por magia tensorflow:
Adicione regularizadores ao criar variáveis ou camadas:
Adicione o termo de regularização ao definir a perda:
fonte
Outra opção para fazer isso com a
contrib.learn
biblioteca é a seguinte, com base no tutorial Deep MNIST no site Tensorflow. Primeiro, supondo que você importou as bibliotecas relevantes (comoimport tensorflow.contrib.layers as layers
), você pode definir uma rede em um método separado:Então, em um método principal, você pode usar o seguinte snippet de código:
Para fazer isso funcionar, você precisa seguir o tutorial MNIST ao qual vinculei anteriormente e importar as bibliotecas relevantes, mas é um bom exercício aprender o TensorFlow e é fácil ver como a regularização afeta a saída. Se você aplicar uma regularização como argumento, poderá ver o seguinte:
Observe que a parte de regularização fornece três itens, com base nos itens disponíveis.
Com regularizações de 0, 0,0001, 0,01 e 1,0, obtenho valores de precisão de teste de 0,9468, 0,9476, 0,9183 e 0,1135, respectivamente, mostrando os perigos de termos de alta regularização.
fonte
Se alguém ainda estiver procurando, eu só gostaria de acrescentar que em tf.keras você pode adicionar regularização de peso passando-os como argumentos em suas camadas. Um exemplo de adição de regularização L2 obtido no atacado do site Tensorflow Keras Tutorials:
Não há necessidade de adicionar manualmente as perdas de regularização com este método, pelo que eu sei.
Referência: https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#add_weight_regularization
fonte
Testei
tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
etf.losses.get_regularization_loss()
com uml2_regularizer
no gráfico, e descobri que eles retornam o mesmo valor. Observando a quantidade do valor, acho que reg_constant já faz sentido no valor definindo o parâmetro detf.contrib.layers.l2_regularizer
.fonte
Se você tem CNN, pode fazer o seguinte:
Em sua função de modelo:
Em sua função de perda:
fonte
Algumas respostas me deixam mais confuso. Aqui, dou dois métodos para torná-lo claro.
Então, ele pode ser adicionado à perda total
fonte
fonte
tf.GraphKeys.REGULARIZATION_LOSSES
não serão adicionados automaticamente, mas há uma maneira simples de adicioná-los:tf.losses.get_regularization_loss()
usatf.add_n
para somar as entradas detf.GraphKeys.REGULARIZATION_LOSSES
elemento sábio.tf.GraphKeys.REGULARIZATION_LOSSES
normalmente será uma lista de escalares, calculada usando funções de regularizador. Ele obtém entradas de chamadas paratf.get_variable
que tenham oregularizer
parâmetro especificado. Você também pode adicionar itens a essa coleção manualmente. Isso seria útil ao usartf.Variable
e também ao especificar regularizadores de atividade ou outros regularizadores personalizados. Por exemplo:(Neste exemplo, presumivelmente, seria mais eficaz regularizar x, já que y realmente se nivela para x grande.)
fonte