Kerasvalu_generator вычисляет больше шагов, чем число, указанное в параметре «steps» - PullRequest
0 голосов
/ 25 июня 2018

Я работаю с пользовательским генератором, который выдает видео.Я пытаюсь выполнить простую оценку с помощью valu_generator для моей модели, но я понял, что изменение размера batch_size дает разные результаты точности.Я решил напечатать полученные имена видео на каждом шаге генератора, и оказалось, что каким-то образом генератор вызывается чаще, чем то, что я указываю в параметре step в Assec_Generator.

Из того, что я понимаю, evaluate_generator 'step параметр указывает количество партий, которые нужно получить.В моем случае мой генератор имеет 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

Как видите, это довольно стандартный генератор.Я печатаю строку отладки на каждом шаге, чтобы увидеть, сколько раз вызывается основной цикл.Это мой общий код:

for k,v in classes_to_evaluate.items():
  # k is a class of videos, e.g. jump, run, etc
  # v is a list of video names corresponding to class k

  print('Evaluating',k, '. # steps:' 3)

  generator=video_generator(files = v, batch_size=batch_size, **gen_params)

  metrics = model.evaluate_generator(generator, steps=3,
            max_queue_size=10, workers=1, use_multiprocessing=False)

  print('Time elapsed on',k,':', end-start)

Исходя из этого, я должен увидеть следующие отпечатки:

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 раз вместо 3 для класса shoot_gun, но затем для некоторых классов я получаю 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 шага, как и положено предполагаемому поведению.

Кто-нибудь знает, почему это происходит и как сделать его хотя бы последовательным?

...