Keras 模型永远用 dask 数据框进行训练
Keras model taking forerver to train with dask dataframe
我正在处理内存不足的大型数据集,我被介绍到 Dask 数据框。我从文档中了解到 Dask 不会将整个数据集加载到内存中。相反,它创建了多个线程,这些线程将按需从磁盘中获取记录。所以我假设批量大小 = 500 的 keras 模型,在训练时它的内存中应该只有 500 条记录。但是当我开始训练时。我正在做 wrong.please 建议的事情需要 forever.May。
训练数据的形状:1000000 * 1290
import glob
import dask.dataframe
paths_train = glob.glob(r'x_train_d_final*.csv')
X_train_d = dd.read_csv('.../x_train_d_final0.csv')
Y_train1 = keras.utils.to_categorical(Y_train.iloc[,1], num_classes)
batch_size = 500
num_classes = 2
epochs = 5
model = Sequential()
model.add(Dense(645, activation='sigmoid', input_shape=(1290,),kernel_initializer='glorot_normal'))
#model.add(Dense(20, activation='sigmoid',kernel_initializer='glorot_normal'))
model.add(Dense(num_classes, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer=Adam(decay=0),
metrics=['accuracy'])
history = model.fit(X_train_d.to_records(), Y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
class_weight = {0:1,1:6.5},
shuffle=False)
您应该使用 Sequential model with generator or with a Sequence 实例中的 fit_generator()
。两者都提供了一种只加载一部分数据的正确方法。
Keras 文档提供了一个很好的例子:
def generate_arrays_from_file(path):
while 1:
f = open(path)
for line in f:
# create Numpy arrays of input data
# and labels, from each line in the file
x, y = process_line(line)
yield (x, y)
f.close()
model.fit_generator(generate_arrays_from_file('/my_file.txt'),
steps_per_epoch=1000, epochs=10)
今天 Keras 不知道 Dask 数据帧或数组。我怀疑它只是将 dask 对象转换为等效的 Pandas 或 Numpy 对象。
如果您的 Keras 模型可以增量训练,那么您可以使用 dask.delayed 和一些 for 循环来解决这个问题。
最终,很高兴看到 Keras 和 Dask 项目相互了解更多,以促进这些工作负载而无需额外工作。
我正在处理内存不足的大型数据集,我被介绍到 Dask 数据框。我从文档中了解到 Dask 不会将整个数据集加载到内存中。相反,它创建了多个线程,这些线程将按需从磁盘中获取记录。所以我假设批量大小 = 500 的 keras 模型,在训练时它的内存中应该只有 500 条记录。但是当我开始训练时。我正在做 wrong.please 建议的事情需要 forever.May。
训练数据的形状:1000000 * 1290
import glob
import dask.dataframe
paths_train = glob.glob(r'x_train_d_final*.csv')
X_train_d = dd.read_csv('.../x_train_d_final0.csv')
Y_train1 = keras.utils.to_categorical(Y_train.iloc[,1], num_classes)
batch_size = 500
num_classes = 2
epochs = 5
model = Sequential()
model.add(Dense(645, activation='sigmoid', input_shape=(1290,),kernel_initializer='glorot_normal'))
#model.add(Dense(20, activation='sigmoid',kernel_initializer='glorot_normal'))
model.add(Dense(num_classes, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer=Adam(decay=0),
metrics=['accuracy'])
history = model.fit(X_train_d.to_records(), Y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
class_weight = {0:1,1:6.5},
shuffle=False)
您应该使用 Sequential model with generator or with a Sequence 实例中的 fit_generator()
。两者都提供了一种只加载一部分数据的正确方法。
Keras 文档提供了一个很好的例子:
def generate_arrays_from_file(path):
while 1:
f = open(path)
for line in f:
# create Numpy arrays of input data
# and labels, from each line in the file
x, y = process_line(line)
yield (x, y)
f.close()
model.fit_generator(generate_arrays_from_file('/my_file.txt'),
steps_per_epoch=1000, epochs=10)
今天 Keras 不知道 Dask 数据帧或数组。我怀疑它只是将 dask 对象转换为等效的 Pandas 或 Numpy 对象。
如果您的 Keras 模型可以增量训练,那么您可以使用 dask.delayed 和一些 for 循环来解决这个问题。
最终,很高兴看到 Keras 和 Dask 项目相互了解更多,以促进这些工作负载而无需额外工作。