Чрезвычайно медленная скорость обучения с Keras при использовании аргумента steps_per_epoch - PullRequest
0 голосов
/ 11 февраля 2019

Я заметил огромное снижение скорости модели обучения, когда я указываю аргумент steps_per_epoch в методе model.fit(..).Когда я указываю steps_per_epoch как None (или не использую его), ETA эпохи составляет 2 секунды подряд:

9120/60000 [===> ..........................] - ETA: 2 с - потеря: 0,7055 - в соответствии: 0,7535

Когда я добавляю аргумент steps_per_epoch, ETA увеличиваетсядо 5 часов, и скорость тренировки становится чрезвычайно низкой:

5/60000 [..............................] - ETA: 5:50:00 - потеря: 1,9749 - согласно: 0,3437

Вот воспроизводимый скрипт:

import tensorflow as tf
from tensorflow import keras
import time

print(tf.__version__)


def get_model():
    model = keras.Sequential([
        keras.layers.Flatten(input_shape=(28, 28)),
        keras.layers.Dense(128, activation='relu'),
        keras.layers.Dense(10, activation='softmax')
    ])
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    return model


(train_images, train_labels), (test_images, test_labels) = keras.datasets.fashion_mnist.load_data()
train_images = train_images / 255.0

model = get_model()

# Very quick - 2 seconds
start = time.time()
model.fit(train_images, train_labels, epochs=1)
end = time.time()
print("{} seconds", end - start)

model = get_model()

# Very slow - 5 hours
start = time.time()
model.fit(train_images, train_labels, epochs=1, steps_per_epoch=len(train_images))
end = time.time()
print("{} seconds", end - start)

Я также пробовал счистый керас и проблема сохранилась.Я использую 1.12.0 версию Tensorflow, Python 3 и Ubuntu 18.04.1 LTS.

Почему аргумент steps_per_epoch вызывает столь значительное снижение скорости и как этого избежать?

Спасибо!

1 Ответ

0 голосов
/ 11 февраля 2019

Обратите внимание, что вы используете fit с массивом данных.Вы не используете fit_generator или какой-либо генератор.

Нет смысла использовать steps_per_epoch, если у вас нет нестандартных идей.

Размер партии по умолчанию в fit равен 32, это означает, что вы тренируетесь с 60000 // 32 = 1875 шагамиза эпоху.

Если вы используете это число 1875, вы будете тренировать то же количество партий, что и по умолчанию None.Если вы используете 60000 шагов, вы умножаете одну эпоху на 32. (Из-за огромной разницы в вашей скорости я бы сказал, что в этом случае также изменяется размер пакета по умолчанию)


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

Общее число, отображаемое при использовании шагов, представляет собой количество шагов.Обратите внимание, как количество выполненных шагов увеличивается на 1 на 1.

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