使用 DB 进行 Keras 持续训练

Keras continuous training with DB

我是 Keras 的新手,仍在寻找持续训练模型的方法。由于我的数据集非常大,无法存储在内存中,因此我应该存储在数据库(NoSql DB- MongoDb 或 HBase)中,并按批次方式训练记录。我的模型 LSTM - 多输入和输出。我目前的训练和预测如下。

model = Sequential()
model.add(LSTM(64, input_shape=in_dim, activation="relu"))
model.add(Dense(out_dim))
model.compile(loss="mse", optimizer="adam")
model.summary()

model.fit(xtrain, ytrain, epochs=100, batch_size=12, verbose=0)    
ypred = model.predict(xtest)

但是,我仍然在寻找非常清晰和简单的示例,这些示例展示了如何提供从数据库中提取的批量记录来训练模型。

如果你的数据集非常大,无法存储在内存中,那么写一个生成器,一次生成一批数据。然后,您可以使用 fit_generator 来训练生成器输出。如果您可以以一种可以 pickle 的方式对生成器进行编码,那么您可以使用 fit_generatoruse_multiprocessing 特性来 运行 生成器在多个进程上并保持多个批处理就绪,这会显着减少磁盘 I/O 等待时间。

示例代码

import keras
import numpy as np

# Dummy database class
class DB:
  def get_total_records_count(self):
    return 1e6
  
  def read_records_at(self, ids):
    X = np.random.randn(len(ids), 50)
    y = np.random.randint(0, 5, len(ids))
    return X, y

# Generator which generate a batch at a time
class DataGenerator(keras.utils.Sequence):
  def __init__(self, db, batch_size=32):
    self.db = db
    self.n = self.db.get_total_records_count()
    self.idx = np.arange(self.n)
    self.batch_size = batch_size

  def __len__(self):
    return int(np.floor(self.n / self.batch_size))

  # Generate a batch of (X, y)
  def __getitem__(self, index):
    idxs = self.idx[index*self.batch_size:(index+1)*self.batch_size]
    return self.db.read_records_at(idxs)

model = keras.models.Sequential()
model.add(keras.layers.Dense(5, input_dim=(50)))
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy')

df = DataGenerator(DB(), 4)
model.fit_generator(df)

输出

Epoch 1/1
250000/250000 [==============================] - 380s 2ms/step - loss: 7.1443
<keras.callbacks.callbacks.History at 0x7fa3ff150048>