Keras与DB进行持续培训



我是Keras的新手,仍在寻找持续训练模型的方法。由于我的数据集存储在内存中非常大,所以我应该将其存储在DB(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中提取的批量记录来训练模型。

如果数据集很大,无法存储在内存中,那么编写一个生成器,一次生成一批数据。然后可以使用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>

最新更新