2016-11-07 3 views
1

Я новичок в тензорной потока, и я вижу 2 различных способов использования GradientDescentOptimiser:Tensorflow разница обучения петли

for (x, y) in zip(trX, trY): 
    sess.run(train_op, feed_dict={X: x, Y: y}) 

Я вижу также этот вид интегрированной петли

sess.run(train_op, feed_dict={X: trX, Y: trY}) 

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

+1

Привет, JLB, можете ли вы дать больше кода о втором случае? Что такое train_op, переменные X и Y? – Corentin

+0

Конечно, здесь ниже есть код с определением стоимости, gradientDescent. Единственное различие действительно в отношении цикла оценки, упомянутого выше. стоимость = tf.square (Y - y_model) # использование квадратичной ошибки для функции стоимости train_op = tf.train.GradientDescentOptimizer (0,001) .minimize (стоимость) var_grad = tf.gradients (стоимость, W) с ТФ. Session() as sess: tf.initialize_all_variables(). Run() для i в диапазоне (100): sess.run (train_op, feed_dict = {X: trX, Y: trY}) – JLB

+0

Вероятно, вы хотите, чтобы последний - получить tenorflow для управления исполнением. – drpng

ответ

0

градиентный спуск представляет собой повторяющийся процесс, который минимизирует функцию стоимости пути обновления параметров много времени с:

W»= W - в delta_W

где W есть множество параметры вашей модели, a скорость обучения и delta_W - это приближение градиента функции стоимости. (см. подробности here)

sess.run(train_op, feed_dict={X:...,Y:...}) вычислить только одну итерацию с использованием X и Y для приближения градиента.

Таким образом, ваш второй код приближает градиент, используя все учебные данные (это дорого, но приближение является точным) и применяйте только один. Недостаточно сближения с минимумом.

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

Я предлагаю вам создать функцию generate_mini_batch которая возвращает случайный набор данных на тренировочном наборе данных с их связанными этикетками и запустить этот цикл:

for i in range(N_STEPS) : # with N_STEPS very large 
     batch_x,batch_y = generate_mini_batch(trX,trY,s) # s is th size of the mini-batch 
     sess.run(train_op, feed_dict={X: batch_x, Y: batch_y}) 

Этот метод называется мини-партию градиентного спуска (см это video), и это фактически широко используется для проблемы оптимизации.

+0

Получил это. Я удивлен, что решение настолько похоже, используя градиент, оцененный для каждой точки по сравнению с полным набором данных. Микроавтобус действительно является классическим решением, которое кажется оптимальным. Благодаря ! – JLB

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