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?
Merci! Cela explique pourquoi lorsque j'utilise le débogueur, je les vois correctement (calcul plus lent ...). – user3428338