fit_generator () выдает результат, отличный от fit()

#numpy #keras #generator

#numpy #keras #генератор

Вопрос:

У меня проблема с выводом fit_generator (), он выдает результат, отличный от метода fit (). У меня есть каталог, в котором хранятся данные пациентов. у patients_x есть все функции, а у patients_y есть соответствующие зависимые переменные, которые я пытаюсь предсказать. Проблема в том, что когда я пытаюсь загрузить каждого пациента и выдавать пакеты его данных на каждой итерации (очевидно, что следующая итерация — следующий пациент), я получаю другой результат, как если бы я делал то же самое, но вместо загрузки 1 пациента на каждой итерации я бы загружал всех пациентов сразу и объединял их. Подводя итог: если я загружаю всех пациентов в память, а затем выдаю пакеты -> это выдает правильный результат, но если я загружаю на каждой итерации только 1 пациента (потому что у меня недостаточно оперативной памяти для загрузки всех данных) и выдаю пакеты от этого пациента -> это выдает плохой результат. Я проверил, выводит ли генератор одни и те же пакеты данных, так и есть. Пожалуйста, помогите мне, если можете.

Этот генератор выдает правильный результат. Я передаю весь набор данных

 def new_gen_shuffle(batch_size, X_train, y_train):
    while True:
        indices = np.arange(X_train.shape[0])
        np.random.shuffle(indices)
        for patient_batch in range(X_train.shape[0]):
                inds = indices[patient_batch * batch_size:(patient_batch   1) * batch_size]
                batch_x = X_train[inds]
                batch_y = y_train[inds]
                if batch_x.shape[0] > 0 and batch_y.shape[0] > 0:
                    yield batch_x, batch_y
  

но этот не работает должным образом. Я выдаю пакеты для каждого пациента (каждая итерация со следующим пациентом). Но оба они выводят одинаковые пакеты

 def batch_generator(batch_size, patients_x, patinets_y):
    while True:
        for patient in range(len(patients_x)):  
            X_train = np.load(path   "/"   patients_x[patient])
            y_train = np.load(path   "/"   patients_y[patient])
            indices = np.arange(X_train.shape[0])
            np.random.shuffle(indices)
            for patient_batch in range(X_train.shape[0]):
                inds = indices[patient_batch * batch_size:(patient_batch   1) * batch_size]
                batch_x = X_train[inds]
                batch_y = y_train[inds]
                if batch_x.shape[0] > 0 and batch_y.shape[0] > 0:
                    yield batch_x, batch_y
  

Комментарии:

1. Когда вы перетасовываете indices массив, не перетасовываете ли вы фактические варианты следования в первом коде, в то время как во втором X_train это не пакет, а скорее единичный вариант следования, и, таким образом, вы используете перетасованный вариант следования вместо перетасованного порядка следования?

2. В обоих случаях я перетасовываю только порядок индексов X_train и y_train, чтобы позже я не выдавал пакеты прямо сверху вниз, а более перемешанным образом. Это обычная вещь, которую нужно делать.

3. Но разве X_train не отличается в каждом конкретном случае? Имеет ли он одинаковую форму в обоих случаях?

4. Дело в том, что в первом случае мой X_train представляет собой целый набор данных из объединенных меньших наборов данных, а во втором случае я перебираю каждый из этих небольших наборов данных, поэтому нет, они не имеют одинаковой формы, но сумма форм всех X_trains во втором случае равна форме X_train в первом случае.

5. Хорошо, но вы используете один и тот же X_train.shape[0] и идентичный код для перетасовки в обоих случаях. Не перетасовываете ли вы в первом случае весь набор данных, а во втором случае только содержимое одного определенного меньшего набора данных?