2017-08-31 100 views
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进度条行为如何?

回答

0

正如你可以在this Keras看到实际检查多少自去年progbar更新时间的流逝,它只有当它比秒一组量(这是默认设置here)更大的打印它。如果您的批量计算持续时间少于此保证金 - 则progbar不会更新,这就是为什么您的批次数不同。

+0

谢谢!这就解释了为什么当我使用调试器时,我正确地看到它们(较慢的计算...)。 – user3428338