使用 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_generator
的 use_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>
我是 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_generator
的 use_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>