什么在我的Keras Model.fit_generator中引发StopIteration [英] what raises StopIteration in mine Keras Model.fit_generator

查看:243
本文介绍了什么在我的Keras Model.fit_generator中引发StopIteration的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有下一个代码:

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 seems like it must works next way:

  • 从数据集中获取30个(仅作为示例)索引
  • 将其吐到22个火车记录和8个验证索引(尚未使用)
  • 将火车索引拆分为生成器中2个索引的批次(因此-11个批次)并且有效-len(list(_batch_generator(train_indexes[:22], 2)))实际返回11
  • 拟合模型:
    • 关于train_generator生成的批次(在我的情况下-11批次,每批次-2张图像)
    • 在时代(steps_per_epoch=steps_per_epoch)中有11批
    • 和1个纪元(nb_epochs=epochsepochs=1)
    • get 30 (just example) indexes from dataset
    • spit it to 22 train records and 8 validate indexes (not used yet)
    • split train indexes to batches of 2 index in generator (so - 11 batches) and it's works - len(list(_batch_generator(train_indexes[:22], 2))) really returns 11
    • fit model:
      • on batches generated by train_generator (in mine case - 11 batches, each - 2 images)
      • with 11 batches in epoch (steps_per_epoch=steps_per_epoch)
      • and 1 epoch (nb_epochs=epochs, epochs=1)

      但是输出有下一个视图:

      But output has next view:

      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 as I can see - all batches are readed successfylly (see "Loaded batch")

      但是在处理时代1的第3批处理过程中,keras会引发StopIteration.

      But StopIteration is raised by keras during processing batch 3 of epoch 1.

      推荐答案

      我也遇到了这个问题,我发现一种方法是可以在数据生成器函数中插入"while True"块.但我无法获得消息来源.您可以参考以下代码:

      I also met this problem, and I find a method is that you can insert "while True" block in data generator func. But I cannot get source. You can refer to my code following:

      while True:
           assert len(inputs) == len(targets)
           indices = np.arange(len(inputs))
           if shuffle:
              np.random.shuffle(indices)
           if batchsize > len(indices):
              sys.stderr.write('BatchSize out of index size')
           batchsize = len(indices)
           for start_idx in range(0, len(inputs) - batchsize + 1, batchsize):
               if shuffle:
                  excerpt = indices[start_idx:start_idx + batchsize]
               else:
                  excerpt = slice(start_idx, start_idx + batchsize)
               yield inputs[excerpt], targets[excerpt]
      

      这篇关于什么在我的Keras Model.fit_generator中引发StopIteration的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆