Пользовательский генератор Keras намного медленнее, чем генератор Keras в генераторе. - PullRequest
0 голосов
/ 12 октября 2018

У меня проблема классификации с несколькими метками.Я написал этот собственный генератор.Он считывает изображения и выходные метки с диска и возвращает их партиями размером 32.

def get_input(img_name):
    path = os.path.join("images", img_name)
    img = image.load_img(path, target_size=(224, 224))

    return img


def get_output(img_name, file_path):
    data = pd.read_csv(file_path, delim_whitespace=True, header=None)

    img_id = img_name.split(".")[0]
    img_id = img_id.lstrip("0")
    img_id = int(img_id)

    labels = data.loc[img_id - 1].values
    labels = labels[1:]

    labels = list(labels)
    label_arrays = []
    for i in range(20):
        val = np.zeros((1))
        val[0] = labels[i]
        label_arrays.append(val)

    return label_arrays


def preprocess_input(img_name):
    img = get_input(img_name)
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)    
    return x

def train_generator(batch_size):
    file_path = "train.txt"
    data = pd.read_csv(file_path, delim_whitespace=True, header=None)

    while True:
        for i in range(math.floor(8000/batch_size)):
            x_batch = np.zeros(shape=(32, 224, 224, 3))
            y_batch = np.zeros(shape=(32, 20))
            for j in range(batch_size):
                img_name = data.loc[i * batch_size + j].values
                img_name = img_name[0]
                x = preprocess_input(img_name)
                y = get_output(img_name, file_path)
                x_batch[j, :, :, :] = x
                y_batch[j] = y

            ys = []
            for i in range(20):
              ys.append(y_batch[:,i])

            yield(x_batch, ys)

Была небольшая проблема с метками, возвращенными в модель, и она была решена в этом вопросе: обучение модели с несколькими выходами keras

Я проверил этот генератор на одной проблеме выхода.Этот пользовательский генератор работает очень медленно.ETA для одной эпохи с использованием этого пользовательского генератора составляет около 27 часов, в то время как встроенный генератор (с помощью flow_from_directory) занимает 25 минут для одной эпохи.Что я делаю неправильно?

Процесс обучения для обоих тестов идентичен, за исключением используемого генератора.Валидационный генератор похож на тренировочный генератор.Я знаю, что не достигну эффективности встроенного генератора Keras, но эта разница в скорости слишком велика.

РЕДАКТИРОВАТЬ

Некоторые руководства, которые я прочитал для создания пользовательскихгенераторы.

Написание пользовательских генераторов Keras

пользовательский генератор для fit_generator (), который выдает несколько входов с различными формами

1 Ответ

0 голосов
/ 12 октября 2018

Возможно, встроенный генератор обрабатывает данные в вашем графическом процессоре, в то время как ваш пользовательский генератор работает на процессоре, что делает его значительно медленнее.

Другое предположение заключается в том, что Keras использует Набор данных вфон.Ваша реализация, вероятно, использует feed-dict, который является самым медленным способом передачи информации в TensorFlow.Лучший способ подачи данных в модели - использовать входной конвейер, чтобы гарантировать, что графическому процессору никогда не придется ждать поступления нового материала.

...