【问题标题】:Keras continuous training with DB使用 DB 进行 Keras 持续训练
【发布时间】:2020-07-28 19:22:55
【问题描述】:

我是 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)

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

【问题讨论】:

  • 您之前的问题看起来非常相似并且已关闭,这个问题看起来也离题了,您要求的示例代码在 SO 中是离题的。

标签: python keras data-science lstm tf.keras


【解决方案1】:

如果您的数据集非常大并且无法存储在内存中,请编写一个生成器,一次生成一批数据。然后,您可以使用fit_generator 对生成器输出进行训练。如果您可以以一种可以腌制的方式对生成器进行编码,那么您可以使用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>

【讨论】:

  • 谢谢 mujjiga。方法“read_records_at”应该有一个数据库客户端并返回请求的表行。不是吗?我将阅读更多关于生成器的内容。请问我可以再知道一件事吗?如果这将无限发生,那么如何使用模型进行预测?我想使用正在训练的最新模型获得预测(可能每 3 小时后)。我应该完全停止训练还是有办法异步或并行获得预测?
  • @你不能为每个人都训练它。继续训练一些数据(训练数据)和评估一些数据(验证数据)。检查交叉验证
  • 我对第一批批次进行了初步验证。这是一个实时应用程序,我可以得到随机预测并稍后验证。但是,现在需要在训练时继续进行预测。无论如何,您的意思是应该停止或完成训练,然后才能发生预测?并且没有 Keras 的支持?
  • 您可以在某些批次后定期转储模型的权重,并使用另一个程序将最新的模型权重提取到模型中并进行预测。基本上一个程序用于训练,另一个程序使用第一个程序权重进行预测。
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 2021-06-13
  • 2018-08-28
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多