Обновление весов после градиентного спуска в TensorFlow - PullRequest
0 голосов
/ 28 августа 2018

Я новичок в тензорном потоке и нейронной сети. Я пытаюсь понять, как обновляются веса после выполнения функции градиентного спуска? Пример кода приведен ниже.

with graph.as_default():

    weights = tf.Variable(
    tf.truncated_normal([image_size * image_size, num_labels]))
    biases = tf.Variable(tf.zeros([num_labels]))

    logits = tf.matmul(train_dataset, weights) + biases
    loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=train_labels, logits=logits))
    loss=loss+tf.multiply(beta, nn.l2_loss(weights))

    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

with tf.Session(graph=graph) as session:
    tf.global_variables_initializer().run()
    _, l, predictions = session.run([optimizer, loss, train_prediction])

Если я правильно понимаю, при запуске «session.run ()» вес переменных и смещения будут обновлены. Будет ли он обновляться в контексте значений, которые имеет счетчик «GradientDescentOptimizer», или это будет просто еще один набор значений «truncated_normal»?

Если регуляризация применяется, как показано ниже,

loss=loss+tf.multiply(beta, nn.l2_loss(weights))

Тогда как тензорный поток узнает, что является правильной переменной для обновления весов в контексте регуляризованных весов? Я не получаю работу TF.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Первоначально weights и biases инициализируются с использованием случайных значений. Когда вы запустите session.run([...]), он оценит optimizer, loss и train_prediction, и все переменные, от которых эти три могут зависеть.

Например, optimizer зависит от loss, loss от train_labels и logits, logits от weights и biases и т. Д. *

Когда он достигает конца (вычисляет все переменные), он обновит weights и biases согласно gradient descent алгоритму (Чтобы понять, как работает тензорный поток, вам нужно понять алгоритм градиентного спуска Сначала проверьте эту ссылку ). Это называется «завершение 1 epoch». В вашем случае вы использовали только 1 epoch, поэтому будет только один проход. Точность тоже не будет такой хорошей. Для дальнейшей оптимизации используйте его, как показано ниже:

Пусть epochs=100

with tf.Session(graph=graph) as session::
     tf.global_variables_initializer().run()
     for i in range(epochs):
         _, l, predictions = session.run([optimizer, loss, train_prediction])

Таким образом, session.run(...) будет выполняться 100 раз, обновляя weights и biases в каждой итерации в соответствии с loss.

Tensorflow обновит все те переменные, которые инициализируются с помощью tf.Variable().

0 голосов
/ 28 августа 2018

Взгляните на следующую картинку с официального сайта Tensorflow , в которой объясняются концепции Graph и Session:

enter image description here

Согласно документации:

  • Вызов tf.constant () создает одну операцию, которая создает значение, добавляет его к графику по умолчанию.
  • Вызов tf.matmul (x, y) создает одну операцию, которая умножает значения объектов tf.Tensor x и y, добавляет ее к графу по умолчанию и возвращает tf.Tensor, который представляет результат умножения
  • Вызов tf.train.Optimizer.minimize добавит операции и тензоры к графу по умолчанию, который вычисляет градиенты, и вернет операцию, которая при запуске применяет эти градиенты к набору переменных.

при запуске «session.run ()» вес переменных и смещения будет обновлено.

На самом деле их значение рассчитывается не обновляется. Например, взгляните на следующий пример:

a = tf.Variable(2)
with tf.Session() as sess:
    sess.run(a.initializer)
    print(sess.run(a))

В этом примере обновление не произойдет.

Снова посмотрите на картинку выше, как вы можете видеть на картинке, когда мы идем вперед, мы понимаем, какие параметры необходимо обновить, поэтому в обратном направлении параметры обновляются в соответствии с потерей на SGD optimizer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...