在使用fit_generator、predict_generator和evaluate_generator时,我遇到了奇怪的行为,我想问以下问题,在文档中找不到答案:
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点。(例如,三四七七,六四九九),但主要的问题似乎是指
workers > 1,这在默认情况下不是这样。所以我想知道第1点和第2点是否是这里的罪魁祸首。
发布于 2018-11-29 11:14:49
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会带来平均批处理度量,这足以满足不同的需求。
https://stackoverflow.com/questions/53537064
复制相似问题