2017-08-31 4 views
1

J'utilise un MLP dans Keras pour la classification binaire d'un ensemble de données tabulaires. Chaque point de données a 66 caractéristiques et j'ai des millions de points de données. Afin d'améliorer l'efficacité de la mémoire lors de la lecture de mon grand ensemble d'entraînement, j'ai commencé à utiliser fit_generator. Je mets un code de test simple ici:Keras Progress Bar génère des numéros de lot aléatoires lors de l'utilisation de 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) 

Et voici mon générateur:

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) 

Dans mes données de la première formation colomn sont les étiquettes et les autres sont les caractéristiques. Si j'ai bien compris fit_generator, je dois empiler les données par lots et les céder. L'entraînement se poursuit sans problème, mais la barre de progression montre des progrès aléatoires qui me troublent. Ici, j'ai utilisé batch_size = 1 pour plus de simplicité. Les résultats sont quelque chose comme ceci:

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 

Je ne comprends pas pourquoi il saute soudainement de 1/18240-38/18240, puis à 72/18240 et ainsi de suite. Lorsque j'utilise des tailles de lots plus grandes, il a le même comportement. Y a-t-il un problème avec mon générateur ou son comportement?

Répondre

0

Comme vous pouvez le voir dans this Keras vérifie en fait combien de temps écoulé depuis la dernière mise à jour progbar et imprime seulement si elle est plus grande qu'une certaine quantité de secondes (ce qui est réglé par défaut here). Si vos calculs par lots ont duré moins que cette marge - alors progbar n'est pas mis à jour et c'est pourquoi vous avez différents sauts dans le nombre de lots.

+0

Merci! Cela explique pourquoi lorsque j'utilise le débogueur, je les vois correctement (calcul plus lent ...). – user3428338