Я хотел бы реализовать условие остановки, основанное на значении градиента функции потерь 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)
Кто-нибудь может подтвердить это?
Любые мысли об этом ответе @AndreaPavone? – lballes
Это именно то, что я хотел сделать. Тем не менее, я не уверен, как норма и суммировать все градиенты. Поскольку у меня есть другой слой в моем CNN и разных весах с другой формой, если я просто делаю то, что вы предложили, я получаю сообщение об ошибке в операции add_n() (поскольку я пытаюсь добавить вместе матрицы с разными формами).Подробнее в редактируемых вопросах. Спасибо! –
О, я запутался в именах функций 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