Keras evaluate_generator计算的步数比“steps”参数中指示的数量多

2024-06-16 11:45:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在与一个自定义生成器,产生视频。我试图用evaluate_generator对我的模型做一个简单的评估,但是我意识到改变批处理的大小会产生不同的精度结果。我决定在每个生成器步骤打印生成的视频名称,结果发现不知何故,生成器被调用的次数超过了evaluate_generator的step参数所指示的次数。在

据我所知,evaluate_generatorstep参数表示要生成的批数。在我的例子中,我的生成器的batch_size为10,因为有30个数据点要计算,所以我设置了steps=3。然后我应该在所有可用的数据点上评估我的模型,分3步,每个步骤10个点。然而,生成器生成的视频比这个还要多,循环回已经分析过的视频,从而影响最终的准确度分数。下面是代码中发生的事情:

首先,我的生成器(简体):

def video_generator(batch_size=1,files=None,shuffle=True,augment=None,load_func='hmdb_npy_rgb',preprocess_func=None,is_train=True):


L=len(files)

print('Calling video_generator. Batch size: ',batch_size,'. Number of files received:',L,'. Augmentation: ',augment)


## This line is just to make the generator infinite, keras needs that
while True:

    ## Define starting idx for batch slicing
    batch_start = 0
    batch_end = batch_size
    c=1

    ## Loop over the txt file while there are enough unseen files for one more batch
    while batch_start < L:

        ## LOAD DATA
        limit = min(batch_end, L)

        # DEBUG STRING
        print('STEP',c,' - yielding', limit-batch_start,'videos.')

        X = load_func(files[batch_start:limit])
        Y = load_labels(files[batch_start:limit])

        ## PREPROCESS DATA
        if preprocess_func is not None:
            X = preprocess_func(X, is_train=is_train)

        ## AUGMENT DATA
        if augment is not None:
            X= augment_video_batch(X, augment)

        ## YIELD DATA
        yield X,Y #a tuple with two numpy arrays with batch_size samples

        ## Increasing idxs for next batch
        batch_start += batch_size
        batch_end += batch_size
        c+=1

如你所见,它是一个相当标准的生成器。我在每一步都打印一个调试字符串,以查看主循环被调用了多少次。这是我的通用代码:

^{pr2}$

基于此,我应该看到以下指纹:

Evaluating shoot_gun . num steps: 3
Calling video_generator. Batch size:  10 . Number of files received:  30 . Augmentation:  None
STEP 1  - yielding 10  videos.
STEP 2  - yielding 10  videos.
STEP 3  - yielding 10  videos.
Time elapsed on shoot_gun : # time elapsed here

然而,我看到的是:

Evaluating shoot_gun . num steps: 3
Calling video_generator. Batch size:  10 . Number of files received:  30 . Augmentation:  None
STEP 1  - yielding 10  videos.
STEP 2  - yielding 10  videos.
STEP 3  - yielding 10  videos.
STEP 1  - yielding 10  videos.
STEP 2  - yielding 10  videos.
STEP 3  - yielding 10  videos.
Time elapsed on shoot_gun : 7.721895118942484

对于其他类来说,步骤的数量是随机的。如您所见,生成器进入循环6次,而不是类shot_gun的3次,但对于某些类,我得到4个步骤,对于其他类,则是5个步骤(所有类都有30个视频,并使用同一生成器的新实例调用)。例如:

Evaluating climb . num steps: 3
Calling video_generator. Batch size:  10 . Number of files received:  30 . Augmentation:  None
STEP 1  - yielding 10  videos.
STEP 2  - yielding 10  videos.
STEP 3  - yielding 10  videos.
STEP 1  - yielding 10  videos.
STEP 2  - yielding 10  videos.
Time elapsed on climb : 7.923485273960978

在这里,正如你所看到的,我得到了5个生成器步骤,而不是我想要的3个步骤。 但随后:

Evaluating kiss . num steps: 3
Calling video_generator. Batch size:  10 . Number of files received:  30 . Augmentation:  None
STEP 1  - yielding 10  videos.
STEP 2  - yielding 10  videos.
STEP 3  - yielding 10  videos.
STEP 1  - yielding 10  videos.
Time elapsed on kiss : 9.742703797062859

在这里,我只有4步。我不明白,因为在批处理大小、视频数量或任何其他参数上,类之间没有差别。重要的是要注意,在任何情况下,我都不会只得到3个步骤,正如预期的行为那样。在

有人知道为什么会发生这种情况,以及如何使它至少保持一致吗?在


Tags: nonesize视频isvideostepbatch步骤