1
我在Keras中使用MLP进行一组表格数据的二进制分类。每个数据点有66个特征,我有数百万个数据点。 为了在阅读我的大型训练集时提高记忆效率,我开始使用fit_generator。我把一个简单的测试代码在这里:Keras Progress Bar在使用fit_generator时生成随机批号
batch_size = 1
input_dim = 66
train_size = 18240
train_steps_per_epoch = int(train_size/batch_size)
model.fit_generator(generate_data_from_file('train.csv', feature_size=input_dim, batch_size=batch_size),
steps_per_epoch=train_steps_per_epoch, nb_epoch=epochs, verbose=1)
这里是我的发电机:
def generate_data_from_file(filename, feature_size, batch_size, usecols=None, delimiter=',', skiprows=0, dtype=np.float32):
while 1:
batch_counter = 0
if usecols is None:
usecols = range(1, feature_size+1)
x_batch = np.zeros([batch_size, feature_size])
y_batch = np.zeros([batch_size, 1])
else:
x_batch = np.zeros([batch_size, len(usecols)])
y_batch = np.zeros([batch_size, 1])
with open(filename, 'r') as train_file:
for line in train_file:
batch_counter += 1
line = line.rstrip().split(delimiter)
y = np.array([dtype(line[0])]) # Extracting labels from the first colomn
x = [dtype(line[k]) for k in usecols] # Extracting features
x = np.reshape(x, (-1, len(x)))
# stacking the data in batches
x_batch[batch_counter - 1] = x
y_batch[batch_counter - 1] = y
# Yield when having one batch ready.
if batch_counter == batch_size:
batch_counter = 0
yield (x_batch, y_batch)
在我的训练数据的第一colomn是标签,其余的功能。 如果我已经正确理解了fit_generator,我必须批量堆叠数据并生成它们。 培训没有问题,但进度条显示随机进度,令我困惑。这里我使用batch_size = 1来简化。结果是这样的:
1/18240 [..............................] - ETA: 1089s - loss: 0.7444 - binary_accuracy: 0.0000e+00
38/18240 [..............................] - ETA: 52s - loss: 0.6888 - binary_accuracy: 0.4211
72/18240 [..............................] - ETA: 42s - loss: 0.6757 - binary_accuracy: 0.6806
110/18240 [..............................] - ETA: 36s - loss: 0.6355 - binary_accuracy: 0.7455
148/18240 [..............................] - ETA: 33s - loss: 0.5971 - binary_accuracy: 0.7500
185/18240 [..............................] - ETA: 32s - loss: 0.4890 - binary_accuracy: 0.8000
217/18240 [..............................] - ETA: 31s - loss: 0.4816 - binary_accuracy: 0.8295
249/18240 [..............................] - ETA: 31s - loss: 0.4513 - binary_accuracy: 0.8474
285/18240 [..............................] - ETA: 30s - loss: 0.4042 - binary_accuracy: 0.8561
315/18240 [..............................] - ETA: 30s - loss: 0.3957 - binary_accuracy: 0.8381
我不知道为什么突然跳到从一万八千二百四十零分之一到一万八千二百四十零分之三十八再到一万八千二百四十零分之七十二等。当我使用更大批量时,它具有相同的行为。 我的发生器或者它的keras进度条行为如何?
谢谢!这就解释了为什么当我使用调试器时,我正确地看到它们(较慢的计算...)。 – user3428338