Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

371
Vistas
StopIteration: generador_salida = siguiente(salida_generador)

Tengo el siguiente código que reescribo para trabajar en un conjunto de datos a gran escala. Estoy usando el generador de Python para ajustar el modelo a los datos obtenidos lote por lote.

 def subtract_mean_gen(x_source,y_source,avg_image,batch): batch_list_x=[] batch_list_y=[] for line,y in zip(x_source,y_source): x=line.astype('float32') x=x-avg_image batch_list_x.append(x) batch_list_y.append(y) if len(batch_list_x) == batch: yield (np.array(batch_list_x),np.array(batch_list_y)) batch_list_x=[] batch_list_y=[] model = resnet.ResnetBuilder.build_resnet_18((img_channels, img_rows, img_cols), nb_classes) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) val = subtract_mean_gen(X_test,Y_test,avg_image_test,batch_size) model.fit_generator(subtract_mean_gen(X_train,Y_train,avg_image_train,batch_size), steps_per_epoch=X_train.shape[0]//batch_size,epochs=nb_epoch,validation_data = val, validation_steps = X_test.shape[0]//batch_size)

Obtengo el siguiente error:

 239/249 [===========================>..] - ETA: 60s - loss: 1.3318 - acc: 0.8330Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 754, in run self.__target(*self.__args, **self.__kwargs) File "/usr/local/lib/python2.7/dist-packages/keras/utils/data_utils.py", line 560, in data_generator_task generator_output = next(self._generator) StopIteration 240/249 [===========================>..] - ETA: 54s - loss: 1.3283 - acc: 0.8337Traceback (most recent call last): File "cifa10-copy.py", line 125, in <module> validation_steps = X_test.shape[0]//batch_size) File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 87, in wrapper return func(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1809, in fit_generator generator_output = next(output_generator) StopIteration

Revisé una pregunta similar publicada aquí , sin embargo, no puedo resolver el error por el que se genera StopIteration.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Los generadores para keras deben ser infinitos:

 def subtract_mean_gen(x_source,y_source,avg_image,batch): while True: batch_list_x=[] batch_list_y=[] for line,y in zip(x_source,y_source): x=line.astype('float32') x=x-avg_image batch_list_x.append(x) batch_list_y.append(y) if len(batch_list_x) == batch: yield (np.array(batch_list_x),np.array(batch_list_y)) batch_list_x=[] batch_list_y=[]

El error ocurre porque Keras intenta obtener un nuevo lote, pero su generador ya llegó a su fin. (Aunque definió un número correcto de pasos, Keras tiene una cola que intentará obtener más lotes del generador incluso si está en el último paso).

Aparentemente, tiene un tamaño de cola predeterminado, que es 10 (la excepción aparece 10 lotes antes del final porque la cola intenta obtener un lote después del final).

over 4 years ago · Santiago Trujillo Denunciar

0

Como indica la pregunta vinculada que proporcionó, Keras Generators tiene que iterar indefinidamente, por lo que puede generar elementos para su capacitación todo el tiempo que desee. Más información sobre eso en este problema de Github.

Para eso, debes hacer algunas modificaciones a tu generador como:

 def subtract_mean_gen(x_source,y_source,avg_image,batch): batch_list_x=[] batch_list_y=[] while 1: #run forever, so you can generate elements indefinitely for line,y in zip(x_source,y_source): x=line.astype('float32') x=x-avg_image batch_list_x.append(x) batch_list_y.append(y) if len(batch_list_x) == batch: yield (np.array(batch_list_x),np.array(batch_list_y)) batch_list_x=[] batch_list_y=[]
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda