【发布时间】:2019-11-02 11:19:26
【问题描述】:
我有一个使用以下代码声明的 Keras 模型:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(units=50, activation="tanh", return_sequences=False, input_shape=(settings["past_size"], len(indicators_used))))
model.add(tf.keras.layers.Dense(3, activation="softmax"))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit_generator(
generator=batch_generator(train_x, train_y),
steps_per_epoch=n_batches_per_epoch,
epochs=settings["epochs"],
workers=5,
use_multiprocessing=True,
max_queue_size=10000)
我尝试了workers、use_multiprocessing 和max_queue_size 设置,但无济于事。输入形状为(100000, 500, 27)。
批处理生成器函数如下所示:
def batch_generator(x, y):
while True:
for i in range(n_batches_per_epoch):
x_train = []
y_train = []
for j in range(settings["past_size"] + settings["batch_size"] * i, settings["past_size"] + (settings["batch_size"] * (i + 1))):
x_train.append(x.iloc[j - past_size:j].to_numpy())
y_train.append(y.iloc[j].to_numpy())
return_x, return_y = np.array(x_train), np.array(y_train)
yield return_x, return_y
执行时间:
- 批量大小 256:
767ms/step - 批量大小 512:
1s/step - 批量大小 1024:
2s/step
我现在面临的问题是 Keras 训练过程非常缓慢。一个 Epoch 大约需要 45 分钟。我不能使用model.fit(),因为数据对于 RAM 来说太大了。
我对 batch_generator 功能的理解是,该函数准备批处理并将它们加载到 GPU / TPU 上,但似乎并非如此。此代码使用 TPU Runtime 在 Google Colab 中运行。
【问题讨论】:
-
您使用的批量大小是多少?你增加了吗?
-
我使用的批量大小为 128。我也尝试增加它。它有点快,但没那么快。
-
请添加数字,而不是像“快但没那么多”这样的主观评价。对于您的硬件和型号而言,每个 epoch 45 分钟可能是正常的,具体取决于瓶颈所在。
-
@MatiasValdenegro 我编辑了问题并为我尝试的不同 batch_size 添加了每一步的执行时间。
-
我确认,批次队列总是满的。因此,太慢的批处理生成或类似的东西不会成为问题。
标签: python tensorflow keras google-colaboratory