Keras:正确使用fit_generator,predict_generator和valuate_generator

时间:2018-11-29 10:38:24

标签: python keras generator

使用fit_generatorpredict_generatorevaluate_generator时出现奇怪的行为,我想问以下问题,在文档中找不到答案:

  1. 使用fit_generator时可以具有不同大小的批次吗?

我的批次按时间定义:它们将在同一小时内发生的事件分组。因此,每个批次可以将不同数量的事件分组。为了清楚起见,这就是我的生成器的样子(遵循this thread中的逻辑):

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)
  1. train_generatorvalidation_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)
  1. 根据我使用的是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)
  1. 类似地,evaluateevaluate_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点已经有很多问题了(例如34776499),但是那里的主要内容似乎是针对

  • 使用ImageDataGenerator进行缩放/不缩放;
  • 改组数据,根据fit_generator documentation“当steps_per_epoch不为None时无效。”
  • 使用workers > 1,默认情况下并非如此。

所以我想知道第1点和第2点是否可能是罪魁祸首。

1 个答案:

答案 0 :(得分:3)

1和2

是的,完全可以。
甚至可以预期2是正确的。

3

未记录预测类。它到底是做什么的?我认为它可以预测指标,而所有其他预测方法都可以预测实际模型的输出,对吧?

4

这很明智...

您确定发生器生成的正是您想要的输出吗?

您可能会尝试查看一些批次以将它们与xy进行比较:

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

即使生成器正确,当您为生成器选择批次时,您也肯定会重新整理(实际排序)数据。

尽管evaluate将按原样获取完整的xy数据,但通常以32为批次,evaluate_generator将获取您选择的批次。因此,每批次的指标肯定会有所不同,并且作为批次指标的平均值的最终结果也会有所不同。因此,除非差异太大,就可以。

PS:我不确定evaluate是指平均批次指标还是整个数据指标,但是evaluate_generator会带来平均批次指标,这足以产生差异。