Keras: ¿cómo se usan los lotes y las épocas en fit_generator ()?
Tengo un video de 8000 cuadros, y me gustaría entrenar un modelo Keras en lotes de 200 cuadros cada uno. Tengo un generador de cuadros que recorre el video cuadro por cuadro y acumula los cuadros (3 x 480 x 640) en una matriz numpyX
de forma(200, 3, 480, 640)
- (tamaño del lote, rgb, altura del marco, ancho del marco) - y rendimientosX
yY
cada 200a fotograma:
import cv2
...
def _frameGenerator(videoPath, dataPath, batchSize):
"""
Yield X and Y data when the batch is filled.
"""
camera = cv2.VideoCapture(videoPath)
width = camera.get(3)
height = camera.get(4)
frameCount = int(camera.get(7)) # Number of frames in the video file.
truthData = _prepData(dataPath, frameCount)
X = np.zeros((batchSize, 3, height, width))
Y = np.zeros((batchSize, 1))
batch = 0
for frameIdx, truth in enumerate(truthData):
ret, frame = camera.read()
if ret is False: continue
batchIndex = frameIdx%batchSize
X[batchIndex] = frame
Y[batchIndex] = truth
if batchIndex == 0 and frameIdx != 0:
batch += 1
print "now yielding batch", batch
yield X, Y
Así es como se ejecutafit_generator()
:
batchSize = 200
print "Starting training..."
model.fit_generator(
_frameGenerator(videoPath, dataPath, batchSize),
samples_per_epoch=8000,
nb_epoch=10,
verbose=args.verbosity
)
Mi entendimiento es que una época termina cuandosamples_per_epoch
el modelo ha visto muestras, ysamples_per_epoch
= tamaño de lote * número de lotes = 200 * 40. Entonces, después del entrenamiento para una época en los cuadros 0-7999, la próxima época comenzará a entrenar nuevamente desde el cuadro 0. ¿Es esto correcto?
Con esta configuraciónEspero que se pasen 40 lotes (de 200 cuadros cada uno) del generador afit_generator
, por época; esto sería 8000 cuadros totales por época - es decir,samples_per_epoch=8000
. Luego, para épocas posteriores,fit_generator
reiniciaría el generador de modo que comenzaremos a entrenar nuevamente desde el comienzo del video. Sin embargo, este no es el caso.Una vez que se completa la primera época (después de que el modelo registra los lotes 0-24), el generador continúa donde lo dejó. ¿No debería comenzar la nueva época desde el principio del conjunto de datos de entrenamiento?
Si hay algo incorrecto en mi comprensión defit_generator
por favor explique. He revisado la documentación, estoejemplo, y estosrelacionado cuestiones. Estoy usando Keras v1.0.7 con el backend TensorFlow. Este problema también se publica en elKeras repo.