Оптимизирует ли оптимизатор TensorFlow мини-пакет, реализованный с помощью API?

Сводит ли Tensorflow к минимуму API для, скажем, GradientDescentOptimizer реализует мини-пакет уже, когда мы вводим входной тензор с размером мини-пакета данных?

Я читал этот болг, который указывал, что мини-пакет не реализован в minimize метод, мы должны сделать compute_gradients сначала, а затем накапливать градиенты, наконец, сделать apply_gradients закончить обучение мини-партии.

def train_standard(opt_type, learning_rate, image_set):
# Arrays for logging accuracy and loss
acc_log = np.zeros(len(image_set))
loss_log = np.zeros(len(image_set))
# Create optimizer
opt = opt_type(learning_rate)
#
# no-minibatch (standard, simple) operation
#
minimize = opt.minimize(loss)
# Create session to execute ops
sess = tf.InteractiveSession()
# Necessary initializations
tf.set_random_seed(1234)
tf.global_variables_initializer().run()
# Train loop
for i, batch in enumerate(image_set):
    sess.run(minimize, feed_dict={x: batch[0], y_: batch[1]})

    acc_log[i] = sess.run(accuracy, 
                          feed_dict={x: mnist.test.images, y_: mnist.test.labels})
    loss_log[i] = sess.run(loss, 
                           feed_dict={x: mnist.test.images, y_: mnist.test.labels})

return acc_log, loss_log

Однако когда я проводил эксперименты, я обнаружил, что два подхода дают схожие результаты. Интересно, если minimize метод сделает обновление мини-пакета, если мы feed_dict является матрицей размера мини-пакета вместо одной строки обучающих данных.

Может ли кто-нибудь помочь мне уточнить этот вопрос и исправить меня, если я ошибаюсь?

С наилучшими пожеланиями

1 ответ

Решение

Это зависит от вашего определения обучения с миниатчами. Один из способов сделать это - просто выполнить выборку мини-пакета, выполнить обновление веса (то есть вычислить проход вперед и назад), выполнить выборку другого мини-пакета, выполнить другое обновление веса и так далее. Это легко сделать с Optimizer.minimize() когда вы просто кормите одну мини-партию за раз. AFAIK, это наиболее часто используемый метод.

Пост, который вам нравится, нацелен на то, чтобы сделать что-то еще: вычислить градиенты на нескольких мини-пакетах (то есть вычислить проход вперед и назад, но не изменять веса), а затем выполнить одно обновление веса с использованием всех накопленных градиентов. Это, конечно, отличается, и больше работы для реализации (как показано в посте).

Другие вопросы по тегам