首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras:正确使用fit_generator、predict_generator和evaluate_generator

Keras:正确使用fit_generator、predict_generator和evaluate_generator
EN

Stack Overflow用户
提问于 2018-11-29 10:38:23
回答 1查看 3.7K关注 0票数 3

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

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

我的批次是按时间来定义的:它们将发生在同一时刻的事件分组。因此,每个批处理可以对不同数量的事件进行分组。为了清晰起见,我的生成器是这样的(遵循这条线中的逻辑):

代码语言:javascript
复制
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

代码语言:javascript
复制
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,预测有很大的不同,这让我感到困惑。

下面是代码:

代码语言:javascript
复制
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返回不同的结果。

守则:

代码语言:javascript
复制
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点。(例如,三四七七六四九九),但主要的问题似乎是指

  • 使用有/不带重标度的ImageDataGenerator;
  • 对数据进行洗牌,根据发电机文件的说法,“当steps_per_epoch不是None时,没有任何影响”。
  • 使用workers > 1,这在默认情况下不是这样。

所以我想知道第1点和第2点是否是这里的罪魁祸首。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-29 11:14:49

1和2

是的,完全没问题。

甚至可以预期2是真的。

3.

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

4.

这很明智..。

你很确定你的发电机在输出你想要的东西吗?

您可以尝试查看几个批,以便将它们与xy进行比较。

代码语言:javascript
复制
for i in range(aFewBatches):
    print(next(train_generator))
    #or create some comparisons

即使生成器是正确的,当您为生成器选择批处理时,也肯定是在对数据进行重新排序(实际上是排序)。

虽然evaluate将接收整个xy数据(通常是32批),但evaluate_generator将接受所选的批处理。因此,每个批处理的度量标准肯定会有所不同,而作为批处理度量平均值的最终结果也将是不同的。所以,除非差别太大,否则没关系。

PS:我不完全确定evaluate会给出平均批处理度量还是整个数据度量,但是evaluate_generator会带来平均批处理度量,这足以满足不同的需求。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53537064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档