使用steps_per_epoch参数时,Keras的训练速度极慢

时间:2019-02-11 16:25:28

标签: python tensorflow keras

当我在steps_per_epoch方法中指定model.fit(..)参数时,我注意到训练模型的速度会大大降低。当我将steps_per_epoch指定为“无”(或不使用它)时,纪元的预计到达时间是连续2秒:

  

9120/60000 [===> ......................................]-ETA:2秒-损失:0.7055-累计:0.7535

当我添加steps_per_epoch参数时,ETA最多可能需要5个小时,并且训练速度变得非常慢:

  

5/60000 [.....................]-预计到达时间: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)

我也尝试过使用纯Keras,但问题仍然存在。我使用1.12.0版的Tensorflow,python 3和Ubuntu 18.04.1 LTS。

为什么steps_per_epoch参数会导致速度显着下降,如何避免这种情况?

谢谢!

1 个答案:

答案 0 :(得分:4)

请注意,您正在对数据数组使用fit。您没有使用fit_generator或任何生成器。

除非您有非常规的想法,否则使用steps_per_epoch是没有意义的。

fit中的默认批次大小为32,这意味着您正在以每个时期60000 // 32 = 1875步进行训练。

如果使用1875这个数字,您将训练与默认None相同数量的批次。如果使用60000步骤,则是将一个纪元乘以32。(由于速度的巨大差异,在这种情况下,默认的批处理大小也会更改)


输出中显示的无级合的总数是图像总数。请注意,已完成项目的数量如何以32的倍数增长。

使用步数时显示的总数是步数。请注意,已完成的步骤数是如何由1增长1。