2017-10-06 2 views
0

계속 하시길 바랍니다. this 질문 및 토론 here - 데이터 세트 API를 사용하여 가변 길이 텐서의 데이터 세트를 가져 와서 동일한 길이의 슬라이스 (세그먼트)로 잘라내려고합니다. 같은 : 내가 발전기에서 세션을 통과하지 않으려는하지만이 링크에 주어진 속임수에 의해 workarounded해야 물론tfrecords 데이터 세트에서 스트라이드 된 슬라이스의 데이터 세트를 생성하십시오.

Dataset = tf.contrib.data.Dataset 
segment_len = 6 
batch_size = 16 

with tf.Graph().as_default() as g: 
    # get the tfrecords dataset 
    dataset = tf.contrib.data.TFRecordDataset(filenames).map(
     partial(record_type.parse_single_example, graph=g)).batch(batch_size) 
    # zip it with the number of segments we need to slice each tensor 
    dataset2 = Dataset.zip((dataset, Dataset.from_tensor_slices(
     tf.constant(num_segments, dtype=tf.int64)))) 
    it2 = dataset2.make_initializable_iterator() 
    def _dataset_generator(): 
     with g.as_default(): 
      while True: 
       try: 
        (im, length), count = sess.run(it2.get_next()) 
        dataset3 = Dataset.zip((
         # repeat each tensor then use map to take a stridded slice 
         Dataset.from_tensors((im, length)).repeat(count), 
         Dataset.range(count))).map(lambda x, c: (
          x[0][:, c: c + segment_len], 
          x[0][:, c + 1: (c + 1) + segment_len], 
        )) 
        it = dataset3.make_initializable_iterator() 
        it_init = it.initializer 
        try: 
         yield it_init 
         while True: 
          yield sess.run(it.get_next()) 
        except tf.errors.OutOfRangeError: 
         continue 
       except tf.errors.OutOfRangeError: 
        return 
    # Dataset.from_generator need tensorflow > 1.3 ! 
    das_dataset = Dataset.from_generator(
     _dataset_generator, 
     (tf.float32, tf.float32), 
     # (tf.TensorShape([]), tf.TensorShape([])) 
    ) 
    das_dataset_it = das_dataset.make_one_shot_iterator() 


with tf.Session(graph=g) as sess: 
    while True: 
     print(sess.run(it2.initializer)) 
     print(sess.run(das_dataset_it.get_next())) 

은 (더미 데이터 세트를 생성하고 다른 반복자지도). 위의 코드는 성경 실패 : 나는 반복자의 초기화를 얻을하려고하지만 난 데이터 세트의 API를 사용하여 노력하고 무엇을 전혀 달성 할 수 있다면 내 질문은 기본적으로 있기 때문에 내 생각이다

tensorflow.python.framework.errors_impl.InvalidArgumentError: TypeError: If shallow structure is a sequence, input must also be a sequence. Input has type: <class 'tensorflow.python.framework.ops.Operation'>. 
     [[Node: PyFunc = PyFunc[Tin=[DT_INT64], Tout=[DT_FLOAT, DT_FLOAT], token="pyfunc_1"](arg0)]] 
     [[Node: IteratorGetNext = IteratorGetNext[output_shapes=[<unknown>, <unknown>], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/cpu:0"](OneShotIterator)]] 

합니다.

답변

1

중첩 된 Dataset에서 Dataset을 만드는 가장 쉬운 방법은 Dataset.flat_map() 변형을 사용하는 것입니다. 이 변환은 함수를 입력 데이터 집합의 각 요소 (예제에서는 dataset2)에 적용하고이 함수는 중첩 된 Dataset (예 : dataset3)을 반환하고 모든 중첩 된 데이터 집합을 단일 Dataset으로 병합합니다.

dataset2 = ... # As above. 

def get_slices(im_and_length, count): 
    im, length = im_and_length 
    # Repeat each tensor then use map to take a strided slice. 
    return Dataset.zip((
     Dataset.from_tensors((im, length)).repeat(count), 
     Dataset.range(count))).map(lambda x, c: (
      x[0][:, c + segment_len: (c + 1) + segment_len], 
      x[0][:, c + 1 + segment_len: (c + 2) + segment_len], 
)) 

das_dataset = dataset2.flat_map(get_slices) 
+0

뛰어난 덕분에 - 그것은 참고로이 어쩌면 MonitoredTrainingSession 잘 재생되지 않는 작업 –

+0

을위한 도구입니다 flat_map 나에게 발생하지 않았다 -이 모델처럼 요약에 바인딩으로 반복자는 (때로는 예기치 않게 고급이다 .cost?) - 또는 나는 아주 틀릴지도 모른다. 그리고 그것은 나의 잘못이다. MonitoredTrainingSession과 데이터 집합 통합에 대해 github에서 논의한 이후로 더 많은 조사를해야 할 것입니다. 그 점을 염두에 두십시오. 즉, 내부에 숨겨진 작업에서 이터레이터를 발전시키는 데주의를 기울여야한다는 것을 적어도 사람들에게 경고해야합니다. MonitoredTrainingSession. –

관련 문제