#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]
и идентичный код для перетасовки в обоих случаях. Не перетасовываете ли вы в первом случае весь набор данных, а во втором случае только содержимое одного определенного меньшего набора данных?