was wirft StopIteration in mir Keras Modell.fit_generator
Habe ich folgenden code:
from sklearn.model_selection import train_test_split
from scipy.misc import imresize
def _chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in range(0, len(l), n):
yield l[i:i + n]
def _batch_generator(data, batch_size):
indexes = range(len(data))
index_chunks = _chunks(indexes, batch_size)
for i, indexes in enumerate(index_chunks):
print("\nLoaded batch {0}\n".format(i + 1))
batch_X = []
batch_y = []
for index in indexes:
record = data[index]
image = _read_train_image(record["id"], record["index"])
mask = _read_train_mask(record["id"], record["index"])
mask_resized = imresize(mask, (1276, 1916)) >= 123
mask_reshaped = mask_resized.reshape((1276, 1916, 1))
batch_X.append(image)
batch_y.append(mask_reshaped)
np_batch_X = np.array(batch_X)
np_batch_y = np.array(batch_y)
yield np_batch_X, np_batch_y
def train(data, model, batch_size, epochs):
train_data, test_data = train_test_split(data)
samples_per_epoch = len(train_data)
steps_per_epoch = samples_per_epoch //batch_size
print("Train on {0} records ({1} batches)".format(samples_per_epoch, steps_per_epoch))
train_generator = _batch_generator(train_data, batch_size)
model.fit_generator(train_generator,
steps_per_epoch=steps_per_epoch,
nb_epoch=epochs,
verbose=1)
train(train_indexes[:30], autoencoder,
batch_size=2,
epochs=1)
So, wie es scheint, muss arbeiten nächste Weg:
- 30 (nur Beispiel) indiziert aus Datensatz
- spucken es in 22 Zug-records und 8 validieren Indizes (noch nicht verwendet)
- split Zug Indizes Chargen von 2 index-generator (so 11 Partien) und es funktioniert -
len(list(_batch_generator(train_indexes[:22], 2)))
wirklich gibt 11 - fit-Modell:
- auf Chargen generiert train_generator (in meinem Fall - 11 Chargen, jeweils 2 Bilder)
- mit 11 Chargen Epoche (
steps_per_epoch=steps_per_epoch
) - und 1 Epoche (
nb_epochs=epochs
,epochs=1
)
Aber die Ausgabe hat folgende Ansicht:
Train on 22 records (11 batches)
Epoch 1/1
Loaded batch 1
C:\Users\user\venv\machinelearning\lib\site-packages\ipykernel_launcher.py:39: UserWarning: The semantics of the Keras 2 argument `steps_per_epoch` is not the same as the Keras 1 argument `samples_per_epoch`. `steps_per_epoch` is the number of batches to draw from the generator at each epoch. Basically steps_per_epoch = samples_per_epoch/batch_size. Similarly `nb_val_samples`->`validation_steps` and `val_samples`->`steps` arguments have changed. Update your method calls accordingly.
C:\Users\user\venv\machinelearning\lib\site-packages\ipykernel_launcher.py:39: UserWarning: Update your `fit_generator` call to the Keras 2 API: `fit_generator(<generator..., steps_per_epoch=11, verbose=1, epochs=1)`
Loaded batch 2
1/11 [=>............................] - ETA: 11s - loss: 0.7471
Loaded batch 3
Loaded batch 4
Loaded batch 5
Loaded batch 6
2/11 [====>.........................] - ETA: 17s - loss: 0.7116
Loaded batch 7
Loaded batch 8
Loaded batch 9
Loaded batch 10
3/11 [=======>......................] - ETA: 18s - loss: 0.6931
Loaded batch 11
Exception in thread Thread-50:
Traceback (most recent call last):
File "C:\Anaconda3\Lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Anaconda3\Lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\user\venv\machinelearning\lib\site-packages\keras\utils\data_utils.py", line 560, in data_generator_task
generator_output = next(self._generator)
StopIteration
4/11 [=========>....................] - ETA: 18s - loss: 0.6663
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-16-092ba6eb51d2> in <module>()
1 train(train_indexes[:30], autoencoder,
2 batch_size=2,
----> 3 epochs=1)
<ipython-input-15-f2fec4e53382> in train(data, model, batch_size, epochs)
37 steps_per_epoch=steps_per_epoch,
38 nb_epoch=epochs,
---> 39 verbose=1)
C:\Users\user\venv\machinelearning\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs)
85 warnings.warn('Update your `' + object_name +
86 '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 87 return func(*args, **kwargs)
88 wrapper._original_function = func
89 return wrapper
C:\Users\user\venv\machinelearning\lib\site-packages\keras\engine\training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, initial_epoch)
1807 batch_index = 0
1808 while steps_done < steps_per_epoch:
-> 1809 generator_output = next(output_generator)
1810
1811 if not hasattr(generator_output, '__len__'):
StopIteration:
So wie ich sehen kann - alle Chargen werden gelesen successfylly (siehe "Geladen batch")
Aber StopIteration ausgelöst durch keras, die während der Verarbeitung von batch 3 epoch-1.
InformationsquelleAutor Alexander Pozharskii | 2017-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Traf ich auch dieses problem, und ich finde eine Methode, die Sie einfügen können "while True" - block in Daten-generator func. Aber ich kann nicht Quelle. Sie können sich auf meine folgenden code:
InformationsquelleAutor cuckooo
Fand ich problem Quelle.
Erstens - mir dataset vollständig Lesen, bevor Sie passen Ende, so wirft es
Exception-Handler gesetzt stop_event und reraise Ausnahme
Aber :
So, wenn stop-Ereignis gesetzt - es können laden von Daten aus einer Warteschlange
Also beschränkte ich max_queue_size zu 1.
InformationsquelleAutor Alexander Pozharskii
Einen Hinweis zu diesem Problem in Fall andere kommen, um diese Seite zu jagen. Die StopIteration-bug ist ein bekanntes Problem in keras, die behoben werden können, wenn Sie einige Zeit, indem Sie sicher, dass Sie Ihre batch-Größe ein ganzzahliges Vielfaches von der Anzahl der Proben. Wenn dies nicht beheben das Problem, eine Sache, die ich gefunden habe, ist, dass mit funky-Datei-Formate, die nicht gelesen werden kann, indem der Daten-generator wird auch manchmal dazu führen, eine stopIteration-Fehler. Um dies zu beheben, rufe ich ein Skript auf meinem Trainings-Ordner und wandelt alle Bilder in ein standard-Dateityp (jpg oder png) vor dem training. Es sieht wie folgt aus.
Ich habe festgestellt, dass dieses Skript ausgeführt wird oder so drastisch reduziert, meine Frequenz, diese Art von Fehler, vor allem, wenn meine Ausbildung Daten kommen aus der irgendwo wie google-Bilder-Suche.
InformationsquelleAutor