Как вычислить grads_and_vars с помощью GradientDescentOptimizer

85
7

У меня есть следующая реализация кода CNN.


optimizer = tf.train.GradientDescentOptimizer(cnn.learning_rate).minimize(loss = cnn.loss, global_step=global_step)
grads_and_vars = optimizer.compute_gradients(cnn.loss)
train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)

Используя его, я получаю следующую ошибку:


grads_and_vars = optimizer.compute_gradients(cnn.loss)
AttributeError: 'Operation' object has no attribute 'compute_gradients'

Я заметил, что использование вышеуказанной реализации GradientDescentOptimizer с tf.train.exponential_decay не предоставляет атрибут 'compute_gradients'
 для оптимизатора.


Может кто-нибудь мне помочь?

спросил(а) 2017-11-15T15:48:00+03:00 3 года, 3 месяца назад
1
Решение
61

Оба compute_gradients и apply_gradients являются методами класса tf.train.GradientDescentOptimizer.


Проблема заключается в том, что вы определяете свой оптимизатор как шаг. Вы должны удалить вызов minimize, например:


optimizer = tf.train.GradientDescentOptimizer(cnn.learning_rate)
grads_and_vars = optimizer.compute_gradients(cnn.loss)
train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)

и он должен работать.

Однако, если вы не используете какое-либо конкретное использование градиентов, вы действительно можете использовать .minimize(...) для прямого определения шага обучения, аналогично вашему train_op:


optimizer = tf.train.GradientDescentOptimizer(cnn.learning_rate)
train_op = optimizer.minimize(loss=cnn.loss, global_step=global_step)

Дальнейшее объяснение того, как apply_gradients работает здесь.

ответил(а) 2017-11-15T17:19:00+03:00 3 года, 3 месяца назад
44

Не забудьте посмотреть исходный код optimizer.py в tensorflow (путь: /tensorflow/tensorflow/python/training/optimizer.py), и вы получите ответ.

Фрагмент кода, то есть от строки 365 до строки 423, представляет собой реализацию функции .minimize(). Не волнуйтесь, большинство из них - заметки. Фактически, он выполняет .compute_gradients() и .apply_gradients() вместе. Поэтому, если вы хотите вызвать только .compute_gradients(), вы должны убедиться, что переменная является экземпляром tf.train.GradientDescentOptimizer().

ответил(а) 2018-04-10T12:39:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема