Керас: Правильное использование fit_generator, Предиката_Генератора и оценки_Генератора - PullRequest
0 голосов
/ 29 ноября 2018

Я сталкиваюсь со странным поведением при использовании fit_generator, predict_generator и evaluate_generator, и я хотел бы задать следующие вопросы, на которые я не нашел ответа в документации:

  1. Можно ли использовать пакеты разных размеров при использовании fit_generator?

Мои партии определяются по времени: они группируют события, которые произошли в один и тот же час.Поэтому каждая партия может группировать разное количество событий.Для ясности, вот так выглядят мои генераторы (следуя логике в этой теме ):

def grouper(g,x,y):
     while True:
        for gr in g.unique():
            # this assigns indices to the entire set of values in g,
            # the subsects to all the rows in which g == gr
            indices = g == gr
            yield (x[indices],y[indices])

all_data_generator = grouper(df['batch_id'], X, Y)
train_generator = grouper(df.loc[df['set'] == 'train', 'batch_id'], X_train, Y_train)
validation_generator = grouper(df.loc[df['set'] == 'val', 'batch_id'], X_val, Y_val)
test_generator = grouper(df.loc[df['set'] == 'test', 'batch_id'], X_test, Y_test)
Можно ли иметь разное количество партий в train_generator и validation_generator?

Для ясности я передаю эти два (разных) числа явно fit_generator при вызове:

train_batches = df.loc[df['set'] == 'train', 'batch_id'].nunique()
val_batches = df.loc[df['set'] == 'val', 'batch_id'].nunique()

history = fmodel.fit_generator(train_generator, 
                             steps_per_epoch=train_batches, 
                             validation_data=validation_generator,
                             validation_steps=val_batches,
                             epochs=20, verbose = 0)
Прогнозы сильно различаются в зависимости от того, что я использую predict_classes или predict_generator, что сбивает меня с толку.

Вот код:

df['pred'] = fmodel.predict_classes(X)

# returns different results from
total_batches = df['batch_id'].nunique()
df['pred_gen'] = fmodel.predict_generator(all_data_generator, steps = total_batches)
Аналогично, evaluate и evaluate_generator возвращают разные результаты.

Код:

scores = model.evaluate(X_test, Y_test, verbose = 0)

# returns different results from
scores_generator = fmodel.evaluate_generator(test_generator, steps=test_batches)

Я знаю, что уже есть много вопросов, касающихся моих пунктов 3.и 4. (например, 3477 , 6499 ), но основные выводы здесь, по-видимому, относятся к

  • с использованием ImageDataGenerator с / без масштабирования;
  • данные перетасовки, которые в соответствии с документацией fit_generator"Не имеет никакого эффекта, если значение steps_per_epoch не равно None."
  • с использованием workers > 1, что по умолчанию не так.

Так что мне интересно, могут ли здесь быть виновны пункты 1. и 2.

1 Ответ

0 голосов
/ 29 ноября 2018

1 и 2

Да, совершенно нормально.
Даже ожидается, что 2 будет правдой.

3

Классы прогнозирования не документированы.Что именно это делает?Я думаю, что он предсказывает индексы, в то время как все другие методы предсказания предсказывают фактические результаты модели, верно?

4

Это разумно ...

Вы уверены, что ваш генератор работает?вывести именно то, что вы хотите?

Вы можете попытаться увидеть несколько партий, чтобы сравнить их с x и y:

for i in range(aFewBatches):
    print(next(train_generator))
    #or create some comparisons

Даже если генераторы верны, вы определенно переставляете (на самом деле сортировка)ваши данные, когда вы выбираете свои партии для генератора.

Хотя evaluate будет принимать все данные x, y в том виде, как они есть, обычно партиями по 32, evaluate_generator будет принимать выбранные вами партии.Таким образом, показатели для каждой партии, безусловно, будут различаться, и конечный результат, который является средним для показателей для партии, также будет другим.Так что, если разница не слишком большая, это нормально.

PS: Я не совсем уверен, даст ли evaluate средние показатели для групп или целые показатели данных, но evaluate_generator принесет средние значения для групп,что достаточно для разницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...