使用fit_generator
,predict_generator
和evaluate_generator
时出现奇怪的行为,我想问以下问题,在文档中找不到答案:
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)
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),但是那里的主要内容似乎是针对
workers > 1
,默认情况下并非如此。所以我想知道第1点和第2点是否可能是罪魁祸首。
答案 0 :(得分:3)
是的,完全可以。
甚至可以预期2是正确的。
未记录预测类。它到底是做什么的?我认为它可以预测指标,而所有其他预测方法都可以预测实际模型的输出,对吧?
这很明智...
您确定发生器生成的正是您想要的输出吗?
您可能会尝试查看一些批次以将它们与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
会带来平均批次指标,这足以产生差异。