当我在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
参数会导致速度显着下降,如何避免这种情况?
谢谢!
答案 0 :(得分:4)
请注意,您正在对数据数组使用fit
。您没有使用fit_generator
或任何生成器。
除非您有非常规的想法,否则使用steps_per_epoch
是没有意义的。
fit
中的默认批次大小为32,这意味着您正在以每个时期60000 // 32 = 1875
步进行训练。
如果使用1875这个数字,您将训练与默认None
相同数量的批次。如果使用60000
步骤,则是将一个纪元乘以32。(由于速度的巨大差异,在这种情况下,默认的批处理大小也会更改)
输出中显示的无级合的总数是图像总数。请注意,已完成项目的数量如何以32的倍数增长。
使用步数时显示的总数是步数。请注意,已完成的步骤数是如何由1增长1。