>source

는 긴 글로 보이지만 대부분은 print ()의 출력입니다. 내 keras .fit_generator() 를 먹이기 위해 맞춤형 발전기 기능을 사용하고 있습니다.  데이터 기능. 내 생성기 함수에서 단순히 일부 데이터 기능 보강을 수행합니다. 이 함수의 끝에서 나는 tf.Session() 를 엽니 다  마지막으로 데이터를 일괄 처리합니다.

def iAmTheCustomGeneratorFunction(...):
    ... data augemenation...
    next_batch = iterator.get_next()
    with tf.Session() as sess:
        count = 0
        while True:
            try:
                features1, features2, labels = sess.run(next_batch)             
                print('\n\n   I am a print before yield. ' + str(count))
                yield [features1, features2], labels
                print('   I am a print behind yield. ' + str(count))
                count = count +1
            except tf.errors.OutOfRangeError:
                print('end of the dataset')
                break

코드를 실행하면 다음과 같은 문제가 발생합니다. 출력 뒤에 질문을 주석으로 썼습니다 (아래 참조). 콘솔에서 출력으로 얻습니다 :

Epoch 1/1    
I am a print before yield. Index: 0
I am a print behind yield. Index: 0
...
I am a print before yield. Index: 9
I am a print behind yield. Index: 9 
# (1) Why does it loop 10 times before it starts with calculating loss/accuracy
...
# -> This is what the output should look like
I am a print before yield. Index: 10
1/58 [......]- ETA: 12:22 - loss: 20.6840 - acc: 0.20
I am a print behind yield. Index: 10
...
I am a print before yield. Index: 56
47/58 [......]- ETA: 11:00 - loss: 18.6840 - acc: 0.42
I am a print behind yield. Index: 56
# (2) Why suddenly the "I am print before/behind yield" is missing?
48/58 [......]- ETA: 10:22 - loss: 16.6840 - acc: 0.53 
...
52/58 [......]- ETA: 9:22 - loss: 15.6840 - acc: 0.54

# (3) Why suddenly information about accuracy/loss is missing?
I am a print before yield. Index: 57 
I am a print behind yield. Index: 57
...
I am a print before yield. Index: 61
I am a print behind yield. Index: 61
...
# -> Now it works as usual
I am a print before yield. Index: 62
53/58 [......]- ETA: 08:22 - loss: 14.6840 - acc: 0.55
I am a print behind yield. Index: 62
...
I am a print before yield. Index: 66
57/58 [......]- ETA: 07:22 - loss: 12.6840 - acc: 0.58
I am a print behind yield. Index: 66
I am a print before yield. Index: 67
# -> Here arises the Exception: 
Duplicate node name in graph: tensors_1/component_0' and IndexError pop from empty list`

내가 얻지 못하는 것은 tensorflow가 모든 것을 올바른 순서로 인쇄하지 않는 이유와 첫 번째 손실 및 정확도 계산으로 인덱스 10에서 시작한다는 것입니다 (위 참조). 이 pop from empty list exception  이 혼란에서 내 의견을 얻습니다. 또한 그것은 첫 번째 시대를 올바르게 끝내지 못합니다.

감사합니다 :-)

  • 답변 # 1

    와이즈 비즈

    (1) Why does it loop 10 times before it starts with calculating loss/accuracy

    문서에서

    max_queue_size : 정수. 생성기 큐의 최대 크기입니다. 지정하지 않으면 max_queue_size의 기본값은 10입니다.

    와이즈 비즈

    제너레이터와 트레이닝 루프가 다른 스레드에서 실행된다는 사실과 관련이있을 수 있습니다. 메시지가 다른 순서로 표시 될 수 있습니다.

    작업자 : 정수. 프로세스 기반 스레딩을 사용할 때 가동되는 최대 프로세스 수입니다. 지정하지 않으면 워커는 기본적으로 1로 설정됩니다. 0이면 기본 스레드에서 생성기를 실행합니다.

    와이즈 비즈

    이것은 생성기에서 사용중인 tf 작업과 관련이있는 것 같습니다. 전처리로 이것을 할 수 있습니까?. 즉, 읽기 위해 tensorflow API에 의존하지 않는 새로운 데이터 세트를 생성하기 만하면됩니다.

    문제 해결 방법론에 대한 제안 : 모델과 독립적으로 발전기를 테스트하는 것이 유용하다는 것을 알았습니다

    예를 들어 어떤 모델로도 공급하지 않고 생성기의 전체 실행을 실행하여 생성기의 배열 모양이 올바른지 확인함으로써 데이터 생성기를 테스트 할 수 있습니다. 특히 마지막 배치입니다.

    그리고 단일 배치 (또는 단일 예)를 공급하여 모델을 테스트하고 모든 모양이 fit_generator 에서 올바르게 체크 아웃되도록하는 것이 항상 유용하다고 믿습니다. .

    (2) Why suddenly the "I am print before/behind yield" is missing?

  • 이전 javascript - 원래 순서의 RxJS mergeMap ()
  • 다음 Java (Selenium)의 CSV 파일에서 URL을 읽을 (새 브라우저 탭 열기) 함수를 만드는 데 도움이 필요합니다