2017-05-23 1 views
18

tf.contrib.data.Dataset 사용 (TensorFlow 1.2에서, herehere 참조) 정말 난을 얼마나 어떤 식 으로든에 맞지 않는 데이터를 얻을 수있는 방법을 방법을 일반적으로 데이터. 제 경우에는 스레드가 있고 거기에 데이터를 받고 끝날 때 미리 알지 못합니다. 끝나면 볼 수 있습니다. 그런 다음 모든 버퍼를 처리 할 때까지 기다렸다가 한 시대를 마쳤습니다. Dataset으로이 로직을 어떻게 얻을 수 있습니까?피드 데이터에 대해

내가 인터페이스보다 더 선호한다는 점에 유의하십시오. 다시 초기화 할 수 있고 또 다른 Dataset으로 재설정 할 수있는 반복기 인터페이스를 제공하기 때문에 QueueBase 인터페이스보다 인터페이스가 더 좋습니다. 이는 닫힌 후에 현재 다시 열 수없는 대기열에 비해 더 강력합니다 (herehere 참조).

아마도 비슷한 질문이나 동일한 질문 일 수 있습니다. 대기열을 통해 Dataset을 어떻게 포장 할 수 있습니까? 일부 스레드는 어딘가에서 데이터를 읽고 어떤 식 으로든 큐에 넣을 수 있습니다. Dataset에 데이터를 가져 오려면 어떻게해야합니까? 더미 텐서를 무한 반복하고 map을 사용하여 내 queue.dequeue()을 반환 할 수는 있지만 실제로는 대기열의 모든 원래 문제, 즉 대기열을 다시 여는 방법을 다시 알게됩니다.

+0

편리한 방법이 있습니까? 실제로 같은 문제에 직면하고 있으며 원시 데이터 로딩 대신 'Dataset' API를 사용하는 것을 고려하고 있습니다. (나는 좀 더 우아한'Dataset '패키징을 찾았습니다.) –

+0

@ Vince.Bdn : 아니요, 응답을받지 못했습니다. TF 개발팀이 이러한 기능을 추가하지 않는 한 현재로서는 그렇게 할 방법이 없다고 생각합니다. 'Dataset'에 누락 된 기능에 대한 지속적인 토론은 [here] (https://github.com/tensorflow/tensorflow/issues/7951)이므로 거기에 의견을 올리고 나와 (GitHub의 @albertz) 및이 StackOverflow 질문을 참조하십시오. . – Albert

답변

7

새로운 Dataset.from_generator() 메서드를 사용하면 Python 생성기에서 제공되는 Dataset을 정의 할 수 있습니다. 현재이 기능을 사용하려면 야간에 TensorFlow 빌드를 다운로드하거나 소스에서 직접 빌드해야합니다 (TensorFlow 1.4의 일부 임).

예제를 구현하는 가장 쉬운 방법은 수신 스레드를 대체하는 것입니다

def receiver(): 
    while True: 
    next_element = ... # Receive next element from external source. 
         # Note that this method may block. 

    end_of_epoch = ... # Decide whether or not to stop based on next_element. 

    if not end_of_epoch: 
     yield next_element # Note: you may need to convert this to an array. 
    else: 
     return # Returning will signal OutOfRangeError on downstream iterators. 

dataset = tf.contrib.data.Dataset.from_generator(receiver, output_types=...) 

# You can chain other `Dataset` methods after the generator. For example: 
dataset = dataset.prefetch(...) # This will start a background thread 
           # to prefetch elements from `receiver()`. 

dataset = dataset.repeat(...) # Note that each repetition will call 
           # `receiver()` again, and start from 
           # a fresh state. 

dataset = dataset.batch(...) 

더 복잡한 토폴로지가 가능합니다. 예를 들어, Dataset.interleave()을 사용하여 병렬로 많은 수신자를 작성할 수 있습니다.

+0

각 예외 사이에 'OutOfRangeError'가 발생하면서 그래프를 통해 데이터 세트의 피드 반복을 수행 할 수 있습니까? 나는 배치 크기가 3 인 반복마다 10 개의 요소를 방출하는 [이 예제] (https://gist.github.com/samwhitlock/93c955b26a329cf2e34c932abff86199)를 썼다. 그래서 "epochs"는 혼합된다. (각 출력 튜플의 첫 번째 정수 배치 당). 내가 정말로하고 싶은 것은 각 시대가 끝날 때 작은 배치를 내 보낸 다음 그래프를 다시 시작하지 않고 다음에 이동하는 것입니다. Tensorflow에서 가능합니까? –

+1

@SamWhitlock이 문제가 완전히 해결되었는지 확신 할 수는 없지만, 초기화 가능한 반복자를 사용하고 있기 때문에 하나의 가능성은 'Dataset.repeat (3)'을 '범위 내의 신기원을위한 Python'(3)으로 대체하는 것입니다.) :'루프, 내부에서'OutOfRangeError'를 잡아 초기화자를 다시 실행할 수 있습니다. 그래도 문제가 해결되지 않으면 새로운 질문을 만들어서 자세히 살펴보십시오! – mrry

+0

이니셜 라이저를 다시 실행 해 보았지만 제대로 작동하지 않는 것 같습니다. 여기에 새로운 질문을 만들었습니다. https://stackoverflow.com/questions/45956139/resetting-a-tensorflow-graph-after-outofrangeerror-when-using-dataset –

관련 문제