2016-08-31 2 views
0

TF를 사용하여 데이터 읽기에 대한 자습서를 읽고 몇 가지 시도를했습니다. 이제, 문제는 CSV에서 데이터를 읽을 때 작성한 배치에서 중복 된 데이터가 표시된다는 것입니다.파일 minibatches에서 읽은 중복 값 TensorFlow

# -*- coding: utf-8 -*- 

from __future__ import absolute_import 
from __future__ import division 
from __future__ import print_function 

import os 
import collections 
import numpy as np 

from six.moves import xrange # pylint: disable=redefined-builtin 
import tensorflow as tf 

class XICSDataSet:  
    def __init__(self, height=20, width=195, batch_size=1000, noutput=15): 
     self.depth = 1 
     self.height = height 
     self.width = width 
     self.batch_size = batch_size 
     self.noutput = noutput 

    def trainingset_files_reader(self, data_dir, nfiles): 

     fnames = [os.path.join(data_dir, "test%d"%i) for i in range(nfiles)] 
     filename_queue = tf.train.string_input_producer(fnames, shuffle=False) 

     reader = tf.TextLineReader() 
     key, value = reader.read(filename_queue) 
     record_defaults = [[.0],[.0],[.0],[.0],[.0]] 
     data_tuple = tf.decode_csv(value, record_defaults=record_defaults, field_delim = ' ') 
     features = tf.pack(data_tuple[:-self.noutput]) 
     label = tf.pack(data_tuple[-self.noutput:]) 

     depth_major = tf.reshape(features, [self.height, self.width, self.depth]) 

     min_after_dequeue = 100 
     capacity = min_after_dequeue + 30 * self.batch_size 
     example_batch, label_batch = tf.train.shuffle_batch([depth_major, label], batch_size=self.batch_size, capacity=capacity, 
                     min_after_dequeue=min_after_dequeue) 

    return example_batch, label_batch 

with tf.Graph().as_default(): 
ds = XICSDataSet(2, 2, 3, 1) 
im, lb = ds.trainingset_files_reader(filename, 1) 

sess = tf.Session() 

init = tf.initialize_all_variables() 
sess.run(init) 
tf.train.start_queue_runners(sess=sess) 

for i in range(1000): 
    lbs = sess.run([im, lb])[1] 
    _, nu = np.unique(lbs, return_counts=True) 
    if np.array_equal(nu, np.array([1, 1, 1])) == False: 
     print('Not unique elements found in a batch!') 
     print(lbs) 

내가 다른 배치 크기, 파일의 서로 다른 번호, 용량 및 min_after_dequeue의 다른 값으로했지만, 난 항상 문제를 얻을 :
내 코드는 다음과 같습니다. 결국, 나는 단지 하나의 파일에서 데이터를 읽고, 배치를 만들고, 예제를 셔플 링하고 싶습니다. 이 테스트를 위해 임시로 만든 내 파일에는 각각 샘플을 나타내는 5 줄과 5 열이 있습니다. 마지막 열은 해당 샘플의 레이블입니다. 이들은 단지 난수입니다. 이 파일을 테스트하기 위해 단지 10 개의 파일 만 사용하고 있습니다.

+1

내 직감은 항목을 여러 번 읽는 것으로 끝나지만 파일의 끝에서 멈추지는 않습니다. min_after_deque가 파일의 항목 수와 크기가 비슷하면 두 개의 동일한 항목이 동일한 일괄 처리에 포함될 가능성이 큽니다. 왜냐하면 두 번째로 읽을 때까지 min_after_deque 엘리먼트에 남아 있기 때문이다. – titus

답변

1

tf.train.string_input_producer(fnames)의 기본 동작은 fnames에 무한 개수의 요소 복사본을 생성하는 것입니다. 따라서 tf.train.shuffle_batch() 용량이 입력 파일 (파일 당 요소 5 개 * 파일 10 개 = 요소 50 개)의 총 개수보다 많고 min_after_dequeue이 요소 수보다 많기 때문에 대기열에 두 개 이상의 요소가 포함됩니다 첫 번째 배치가 생성되기 전에 입력 데이터의 전체 복사본이 생성됩니다. 따라서 일부 일괄 처리에는 중복 데이터가 포함될 수 있습니다.

각 예제를 한 번만 처리하려는 경우 tf.train.string_input_producer()을 만들 때 명시적인 num_epochs=1을 설정할 수 있습니다. 예를 들면 다음과 같습니다.

def trainingset_files_reader(self, data_dir, nfiles): 
    fnames = [os.path.join(data_dir, "test%d" % i) for i in range(nfiles)] 

    filename_queue = tf.train.string_input_producer(
     fnames, shuffle=False, num_epochs=1) 

    # ...