Я работаю с пользовательским генератором, который выдает видео.Я пытаюсь выполнить простую оценку с помощью 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 шага, как и положено предполагаемому поведению.
Кто-нибудь знает, почему это происходит и как сделать его хотя бы последовательным?