Генераторы данных модели Keras для изображений с броском MultiLabelBinarizer generator_output = next (output_generator) StopIteration - PullRequest
0 голосов
/ 31 марта 2019

Я работал над обучением модели keras из большого набора данных изображений с несколькими размерами меток около 4-5 ГБ, но программа, которую я написал, работает нормально для меньшего набора данных, но для большего набора данных у меня заканчиваетсяпамяти, поэтому мне нужно написать собственные генераторы, которые я попробовал и почти сделал, но я застрял с некоторым исключением во время обучения через мои генераторы данных, и исключение:

1/25 [> .............................] - ETA: 2:13 - потери: 1,0268 - в соответствии: 0,5038

2/25[=> ............................] - ETA: 1:07 - убыток: 1,0172 - согласно: 0,5086

3/25 [==> ...........................] - ETA: 46 с - потери: 0,9993 - в соотв. 0,5123

4/25 [===> ..........................] - ETA: 34 с - потери: 0,9795 - в соотв.: 0.5141

Traceback (последний вызов был последним): файл "/home/innovation/PycharmProjects/keras-multi-label/TestGen.py", строка 165, в эпохах = EPOCHS, подробный = 1) файл "/ главная / инновация / anaconda3 / envs / тс-ГП-cuda9 / Библиотека / python3.6 / site-packages / keras / legacy / interfaces.py ", строка 91, в файле возврата функции оболочки (* args, ** kwargs) Файл" / home / innovation / anaconda3 / envs / tf-gpu-cuda9 / lib /python3.6 / site-packages / keras / engine / training.py ", строка 1418, в fit_generator initial_epoch = initial_epoch) Файл" /home/innovation/anaconda3/envs/tf-gpu-cuda9/lib/python3.6/site-packages / keras / engine / training_generator.py ", строка 181, в fit_generator generator_output = next (output_generator) StopIteration

Я публикую здесь свой код, я был бы очень признателен, если кто-то может помочьисправить эту проблему

    import json
    from imutils import paths
    import random
    import cv2
    from sklearn.model_selection import train_test_split
    import numpy as np
    import os
    from sklearn.preprocessing import MultiLabelBinarizer
    from keras.optimizers import Adam
    from pyimagesearch.smallervggnet import SmallerVGGNet
    from keras.preprocessing.image import ImageDataGenerator
    import matplotlib.pyplot as plt
    import pickle
    # load the user configs
    with open('conf/conf.json') as f:
      config = json.load(f)

    IMAGE_DIMS = (96, 96, 3)

    EPOCHS = 75
    INIT_LR = 1e-3
    BS = 32

    # config variables
    dataset     = config["dataset"]
    model_path      = config["model"]
    labelbin   = config["labelbin"]
    plot   = config["plot"]
    test_image     = config["test_image"]

    print("[INFO] loading images...")
    imagePaths = sorted(list(paths.list_images(dataset)))
    random.seed(42)
    random.shuffle(imagePaths)

    labels = list(imagePath.split(os.path.sep)[-2].split("_") for imagePath in imagePaths)

    images = (cv2.resize(cv2.imread(imagePath), (IMAGE_DIMS[1], IMAGE_DIMS[0])) for imagePath in imagePaths)

    #construct the image generator for data augmentation
    aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1,
       height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
       horizontal_flip=True, fill_mode="nearest")

    # Data generator
    def create_generator(images,labels,BS):
        arr_images = []
        slice_count = 0
        count_remain = total_items

        for (idx,image) in enumerate(images):

        count = idx+1

        if count % BS == 0:
            arr_images.append(image)
            _labels_chunk = labels[slice_count:count]
            slice_count = count
            count_remain = total_items - count

            (trainX, testX, trainY, testY) = train_test_split(np.array(arr_images, dtype="float") / 255.0,_labels_chunk, test_size=0.2, random_state=42)
            yield trainX, trainY
            arr_images.clear()



        else:
            arr_images.append(image)

            if count_remain == len(arr_images):
            _labels_chunk = labels[slice_count:count]
            (trainX, testX, trainY, testY) = train_test_split(np.array(arr_images, dtype="float") / 255.0,_labels_chunk, test_size=0.2, random_state=42)

            yield trainX, trainY
            arr_images.clear()

    mlb = MultiLabelBinarizer()
    labels = mlb.fit_transform(labels)


    model = SmallerVGGNet.build(
       width=IMAGE_DIMS[1], height=IMAGE_DIMS[0],
       depth=IMAGE_DIMS[2], classes=len(mlb.classes_),
       finalAct="sigmoid")


    opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)

    model.compile(loss="binary_crossentropy", optimizer=opt,
       metrics=["accuracy"])


    print("[INFO] training network...",len(labels))
    H = model.fit_generator(
       create_generator(images,labels,500),
       steps_per_epoch=25,
       epochs=EPOCHS, verbose=1)


    # save the model to disk
    print("[INFO] serializing network...")
    model.save(model_path)

Заранее спасибо

...