Estou usando o TensorFlow para treinar uma rede neural. É assim que estou inicializando GradientDescentOptimizer
:
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
mse = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
O que acontece aqui é que não sei como definir uma regra de atualização para a taxa de aprendizado ou um valor de decaimento para isso.
Como posso usar uma taxa de aprendizagem adaptativa aqui?
python
tensorflow
Nome em Exibição
fonte
fonte
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Parece que a definição de uma nova taxa de aprendizado requer a inicialização do modelo com as variáveis já treinadas. Mas não consigo descobrir como fazer isso.Respostas:
Em primeiro lugar,
tf.train.GradientDescentOptimizer
é projetado para usar uma taxa de aprendizado constante para todas as variáveis em todas as etapas. O TensorFlow também fornece otimizadores adaptativos prontos para uso, incluindo otf.train.AdagradOptimizer
e otf.train.AdamOptimizer
, e eles podem ser usados como substitutos imediatos.No entanto, se você deseja controlar a taxa de aprendizado com a descida gradiente de outra forma, você pode tirar vantagem do fato de que o
learning_rate
argumento para otf.train.GradientDescentOptimizer
construtor pode ser umTensor
objeto. Isso permite que você calcule um valor diferente para a taxa de aprendizagem em cada etapa, por exemplo:Como alternativa, você pode criar um escalar
tf.Variable
que mantenha a taxa de aprendizado e atribuí-lo a cada vez que quiser alterar a taxa de aprendizado.fonte
tf.clip_by_norm
não aceita um tensor para a norma do clipe, então que tal fazer[(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]
, ondect = tf.placeholder('float32', shape=[])
tf.clip_by_norm
, a única coisa que o impede de aceitar um tensor como entrada é oconstant_op.constant(1.0 / clip_norm)
. Substituir essa expressão pormath_ops.inv(clip_norm)
faria com que funcionasse com uma entrada de espaço reservado (ou qualquer outro tensor).)Tensorflow fornece uma op para aplicar automaticamente um decaimento exponencial a um tensor taxa de aprendizagem:
tf.train.exponential_decay
. Para obter um exemplo em uso, consulte esta linha no exemplo do modelo convolucional MNIST . Em seguida, use a sugestão de @mrry acima para fornecer essa variável como o parâmetro learning_rate para o otimizador de sua escolha.O principal trecho a ser examinado é:
Observe o
global_step=batch
parâmetro a minimizar. Isso diz ao otimizador para incrementar o parâmetro 'batch' para você toda vez que treinar.fonte
batch
é chamadaglobal_step
e existem várias funções de conveniência, uma para criá-latf.train.create_global_step()
(que simplesmente cria um inteirotf.Variable
e o adiciona àtf.GraphKeys.GLOBAL_STEP
coleção) etf.train.get_global_step()
.O algoritmo de gradiente descendente usa a taxa de aprendizado constante que você pode fornecer durante a inicialização . Você pode passar por várias taxas de aprendizagem da maneira mostrada por Mrry.
Mas em vez disso, você também pode usar otimizadores mais avançados, que têm uma taxa de convergência mais rápida e se adaptam à situação.
Aqui está uma breve explicação com base no meu entendimento:
Adam ou momentum adaptativo é um algoritmo semelhante ao AdaDelta. Mas, além de armazenar taxas de aprendizagem para cada um dos parâmetros, ele também armazena mudanças de momentum para cada um deles separadamente
A poucos visualizações :
fonte
Dos documentos oficiais do tensorflow
fonte
Se você deseja definir taxas de aprendizagem específicas para intervalos de épocas como
0 < a < b < c < ...
. Em seguida, você pode definir sua taxa de aprendizado como um tensor condicional, condicional à etapa global, e alimentar isso normalmente para o otimizador.Você poderia conseguir isso com um monte de
tf.cond
instruções aninhadas , mas é mais fácil construir o tensor recursivamente:Então, para usá-lo, você precisa saber quantas etapas de treinamento existem em uma única época, para que possamos usar a etapa global para alternar no momento certo e, finalmente, definir as épocas e as taxas de aprendizagem desejadas. Então, se eu quiser as taxas de aprendizado
[0.1, 0.01, 0.001, 0.0001]
durante os intervalos de época de[0, 19], [20, 59], [60, 99], [100, \infty]
respectivamente, eu faria:fonte