Как идет процесс оптимизации с тензорным потоком?

У меня простой график в tensorflow

(1) X = tf.Variable(dtype=tf.float32, shape=(1, 3), name="X", initial_value=np.array([[1,2,3]]))
(2) y = tf.reduce_sum(tf.square(X))  - 2 * tf.reduce_sum(tf.sin(tf.square(X)))
(3) training_op = tf.train.GradientDescentOptimizer(0.3).minimize(y)

Вот код для 5 шагов градиентного спуска:

with tf.Session() as sess:
    sess.run(init)
    for i in range(5):
        (4) *res, _ = sess.run(fetches=[X, y, training_op])
        print(res)

[array([[1., 2., 3.]], dtype=float32), 13.006426]
[array([[ 1.0483627 , -0.76874477, -2.080069  ]], dtype=float32), 4.9738936]
[array([[ 0.9910337 , -1.0735381 ,  0.10702228]], dtype=float32), -1.3677568]
[array([[ 1.0567244 , -0.95272505,  0.17122723]], dtype=float32), -1.3784065]
[array([[ 0.978967  , -1.0848547 ,  0.27387527]], dtype=float32), -1.4229481]

Я пытаюсь понять, как проходит процесс оптимизации. Не могли бы вы объяснить это шаг за шагом? Я думал, что это должно быть так:

  1. Оценить Х (1)
  2. Оценить у (2)
  3. Рассчитайте градиент и сделайте шаг $ X = X -  gamma (3?) $ (3) (как здесь сказано: «Вызов минимума () обеспечивает как вычисление градиентов, так и их применение к переменным».
  4. Затем выдайте все запрошенные в fetches переменные (4)

    Но вывод показывает, что при первом run дает начальные значения, так что я в замешательстве ...

tf version == '1.15.0'

Заранее спасибо!

Всего 1 ответ


Они происходят в указанном порядке,

У вас есть fetches=[X, y, training_op] . Это происходит по порядку. Что значит,

  1. Оценивает X (так что training_op еще не было)
  2. Оцените y (все еще training_op еще не произошло)
  3. Выполняет training_op (теперь X и y изменились).

Если вы хотите, чтобы переменная X изменялась при первом запуске, просто сделайте.

_, *res = sess.run(fetches=[training_op, X, y])

Есть идеи?

10000