Penso che la cosa più semplice che puoi fare sia la sottoclasse dell'ottimizzatore.
Ha diversi metodi, che immagino vengano spediti in base al tipo di variabile. Le variabili Dense regolari sembrano passare attraverso lo _apply_dense
. Questa soluzione non funzionerà per sparse o altre cose.
Se si guarda il implementation si può vedere che sta memorizzando gli EMA m
e t
in questi "slot". Quindi, qualcosa di simile sembra farlo:
class MyAdam(tf.train.AdamOptimizer):
def _apply_dense(self, grad, var):
m = self.get_slot(var, "m")
v = self.get_slot(var, "v")
m_hat = m/(1-self._beta1_power)
v_hat = v/(1-self._beta2_power)
step = m_hat/(v_hat**0.5 + self._epsilon_t)
# Use a histogram summary to monitor it during training.
tf.summary.histogram("hist", step)
return super(MyAdam,self)._apply_dense(grad, var)
step
qui sarà nell'intervallo [-1,1], questo è ciò che viene moltiplicato per il tasso di apprendimento, alla determina il passaggio effettivo applicato ai parametri.
Spesso non c'è alcun nodo nel grafico perché c'è un grande training_ops.apply_adam
che fa tutto.
Qui sto solo creando un sommario dell'istogramma da esso. Ma potresti incollarlo in un dizionario allegato all'oggetto e leggerlo più tardi o fare quello che vuoi con esso.
Droping che in mnist_deep.py
, e l'aggiunta di alcuni riepiloghi per il ciclo di formazione:
all_summaries = tf.summary.merge_all()
file_writer = tf.summary.FileWriter("/tmp/Adam")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(20000):
batch = mnist.train.next_batch(50)
if i % 100 == 0:
train_accuracy,summaries = sess.run(
[accuracy,all_summaries],
feed_dict={x: batch[0], y_: batch[1],
keep_prob: 1.0})
file_writer.add_summary(summaries, i)
print('step %d, training accuracy %g' % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
produce il seguente figura TensorBoard:
Leggendo rapidamente il codice, è possibile ottenere tr : print sess.run (adam_op._lr_t), dopo aver adam_op = tf.train.AdamOptimizer (0.1, beta1 = 0.5, beta2 = 0.5) , treno_op = adam_op.minimize (costo). Tuttavia, non è sicuro che funzioni nel tuo codice. Puoi testare qickly? –
Nota a margine: il modo giusto di pensare ad adam non è come la velocità di apprendimento (scalare i gradienti), ma come una dimensione del passo. L'intervallo di apprendimento che passi è la dimensione massima del passo (per parametro), Adam prende passi fino a quella dimensione, a seconda di quanto è consistente la sfumatura. – mdaoust
OK @mdaoust, ma come posso ottenere il tasso di apprendimento in ogni fase? Ho provato il suggerimento di Sung Kim ma non funziona, poiché restituisce una linea piatta. Grazie. – Escachator