2016-06-29 3 views
3

Я хотел бы реализовать условие остановки, основанное на значении градиента функции потерь w.r.t. веса. Например, предположим, что у меня есть что-то вроде этого:условие остановки на градиентном значении тензор потока

optimizer = tf.train.AdamOptimizer() 
grads_and_vars = optimizer.compute_gradients(a_loss_function) 
train_op = optimizer.apply_gradients(grads_and_vars) 

тогда я хотел бы запустить график с чем-то вроде этого:

for step in range(TotSteps): 
    output = sess.run([input], feed_dict=some_dict) 
    if(grad_taken_in_some_way < some_treshold): 
     print("Training finished.") 
     break 

Я не уверен, что я должен пройти Sess. run(), чтобы получить в качестве вывода также градиент (помимо всего прочего, что мне нужно). Я даже не уверен, что это правильный подход, или я должен делать это по-другому. Я сделал несколько попыток, но я терпел неудачу каждый раз. Надежда у кого-то есть намеки. Спасибо заранее!

EDIT: английский коррекция

EDIT2: Ответ на Iballes именно то, что я хотел сделать. Тем не менее, я не уверен, как норма и суммировать все градиенты. Поскольку у меня есть другой слой в моем CNN и разных весах с другой формой, если я просто делаю то, что вы предложили, я получаю сообщение об ошибке в операции add_n() (поскольку я пытаюсь добавить вместе матрицы с разными формами). Поэтому, вероятно, я должен был бы сделать что-то вроде:

grad_norms = [tf.nn.l2_normalize(g[0], 0) for g in grads_and_vars]  
grad_norm = [tf.reduce_sum(grads) for grads in grad_norms] 
final_grad = tf.reduce_sum(grad_norm) 

Кто-нибудь может подтвердить это?

ответ

2

Ваша линия output = sess.run([input], feed_dict=some_dict) заставляет думать, что у вас есть небольшое непонимание команды sess.run. То, что вы называете [input], должно быть списком тензоров, которые должны быть получены командой sess.run. Следовательно, это результат, а не вход. Чтобы решить ваш вопрос, давайте предположим, что вы делаете что-то вроде output = sess.run(loss, feed_dict=some_dict) (чтобы отслеживать потерю обучения).

Кроме того, предположим, что вы хотите сформулировать свой критерий остановки, используя норма градиента (сам градиент представляет собой многомерную величину). Следовательно, то, что вы хотите сделать, - это получить норму градиента каждый раз, когда вы выполняете график. Для этого вам нужно сделать две вещи. 1) Добавьте градиентную норму к расчетному графу. 2) Извлеките его в каждом вызове до sess.run в вашей тренировочной петле.

объявления 1) Вы добавили градиенты на графике с помощью

optimizer = tf.train.AdamOptimizer() 
grads_and_vars = optimizer.compute_gradients(a_loss_function) 

и теперь имеют тензоры удерживающие градиенты в grads_and_vars (по одному для каждой переменной обученной на графике). Давайте возьмем норму каждого градиента, а затем подведем итог:

grad_norms = [tf.nn.l2_loss(g) for g, v in grads_and_vars] 
grad_norm = tf.add_n(grad_norms) 

Там у вас есть ваша градиентная норма.

Объявление 2) Внутри вашей петли выберите градиентную норму вместе с потерей, сообщив команде sess.run, чтобы сделать это.

for step in range(TotSteps): 
    l, gn = sess.run([loss, grad_norm], feed_dict=some_dict) 
    if(gn < some_treshold): 
     print("Training finished.") 
     break 
+0

Любые мысли об этом ответе @AndreaPavone? – lballes

+0

Это именно то, что я хотел сделать. Тем не менее, я не уверен, как норма и суммировать все градиенты. Поскольку у меня есть другой слой в моем CNN и разных весах с другой формой, если я просто делаю то, что вы предложили, я получаю сообщение об ошибке в операции add_n() (поскольку я пытаюсь добавить вместе матрицы с разными формами).Подробнее в редактируемых вопросах. Спасибо! –

+0

О, я запутался в именах функций tensorflow. Я хотел бы сделать это '' grad_norms = [tf.nn.l2_loss (g) для g, v в grads_and_vars] ''. В моем первоначальном ответе использовалась функция '' tf.nn.l2_norm'', которая не существует, и я сделал ** не ** означает 'tf.nn.l2_normalize''. Функция '' tf.nn.l2_loss'' берет квадрат нормы L2 вектора и, следовательно, производит скаляр независимо от размеров этого тензора. Затем эти скаляры могут быть объединены для вычисления нормы L2 общего градиента. (Исправил это в ответе.) – lballes

Смежные вопросы