2016-08-31 8 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の異なる値で試してみましたが、私はいつも問題を取得します。最終的には、バッチを作成して例をシャッフルするだけで、1つのファイルからデータを読み取れるようにしたいと考えています。 このテストのために特別に作成された私のファイルには、サンプルを表す5行と5列があります。最後の列はそのサンプルのラベルです。これらは単なる乱数です。私はこれをテストするために10個のファイルしか使用していません。

+1

私の勘違いは、エントリを複数回読み取ることになりますが、ファイルの最後には止まらず、折り返します。 min_after_dequeがファイルのエントリ数に匹敵するサイズの場合、2つの同一のエントリが同じバッチになる可能性があります。 1つはmin_after_deque要素の中に2度読み込まれるまで残っているからです。 – titus

答えて

1

tf.train.string_input_producer(fnames)のデフォルトの動作では、fnamesに無限個の要素のコピーが生成されます。したがって、tf.train.shuffle_batch()の容量が入力ファイルの要素数の合計(ファイルあたり5要素* 10ファイル= 50要素)より大きく、min_after_dequeueも要素数よりも大きいため、キューには少なくとも2つの要素が含まれます最初のバッチが生成される前に入力データの完全なコピーが作成されます。その結果、一部のバッチに重複データが含まれる可能性があります。

各サンプルを1回だけ処理する場合は、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) 

    # ... 
関連する問題