2017-05-31 16 views
0

3つのキューがあり、1つはstring_input_producerによって提供されるFileReader、2つはint32のベクトルとint32の行列でそれぞれ供給されるslice_input_producersです。それらは、順番に読むとき、それらが1つの例を形成する画像、質問、および回答を提供するように、すべて注文される。Tensorflowでキューをシャッフルしながら一貫性を維持する

私がしたいことは、それらの間の関係を維持しながらシャッフルすることです。

私はshuffle_batchを使ってみましたが、これは関係を保存しないので役に立たなくなってしまいます。

私の現在のコード(該当するビット):だから

def load_images(self,images,q_name): 
    filename_queue = tf.train.string_input_producer(images,shuffle=False,name=q_name) 
    reader = tf.WholeFileReader() 
    key, value = reader.read(filename_queue) 
    imagedata = tf.image.decode_png(value) 
    imagedata = tf.cast(tf.image.resize_images(imagedata,[224,224],tf.image.ResizeMethod.NEAREST_NEIGHBOR),tf.float32) 
    imagedata = tf.div(imagedata,tf.reduce_max(tf.abs(imagedata))) 
    imagedata.set_shape([224,224,3]) 
    return key,imagedata 

keys[testfile],imagedata[testfile] = self.load_images(imagefiles[testfile],'test') 
keys[trainfile],imagedata[trainfile] = self.load_images(imagefiles[trainfile],'train') 

s_train_answer_batch,s_train_question_batch,s_train_image_batch = tf.train.batch([tf.train.slice_input_producer([answers[trainfile]],shuffle=False)[0],tf.train.slice_input_producer([questions[trainfile]],shuffle=False)[0],imagedata[trainfile]],batch_size=batch_size,capacity=batch_size*2,enqueue_many=False) 

feed_dict = {self.x_image:s_train_image_batch.eval(), self.x_question: s_train_question_batch.eval(), self.y_:s_train_answer_batch.eval(),self.keep_prob:keep_prob} 

_,ce, summary, image_summary, accuracy= sess.run([self.train_step,self.cross_entropy, self.summary_op, self.image_summary_op, self.accuracy],feed_dict=feed_dict) 

、絶対的に明確にする:画像、質問ならば、および10に数字の1のちょうどベクトル行列に答えて、私はしたいと思いますフィード辞書が見えるように:

q:[4,1,8,2,3,9,6,5,7],a:[4,1,8,2,3,9,6,5,7],i:[4,1,8,2,3,9,6,5,7] 

が、現在、彼らは次のようになりたい:

q:[4,1,8,2,3,9,6,5,7],a:[7,3,1,5,6,2,4,9,8],i:[9,8,3,5,4,6,7,1,2] 

答えて

0

私はそれを解決した! .eval()を使用して出力を取得しないで、sess.run([image_batch、question_batch、answer_batch])を呼び出します。これは順序を保持し、シャフリングを行います。なぜ私は考えていない。

+0

これを行うには、より良い方法があるはずです。あなたの例を得るためにsess.run()を実行する必要はありません。また、feed_dictを使用すると、読者の外にあるものをフィードディクショナリに配管し、ノードをグラフに追加したり、データを複数回コピーしたりするので、効率が悪いだけでなく、読者の目的も敗退します。 3人の読者が1つのイメージ/質問/回答を返すようにして、 'tf.train.shuffle_batch([image、question、answer])'を呼んだのですか?その関数は並べ替えが行われる場所ではなく、以前のものから来るはずです。 – jpm

+0

私はおそらく私がしたことを誤解したと思う。私のコードは次のようになります: 'b_image、_question、b_answer = sess.run(s_train_answer_batch、s_train_question_batch、s_train_image_batch)' 'feed_dict = {self.x_image:b_image、self.x_question:b_question、self.y_: b_answe、self.keep_prob:keep_prob} ' – Amylizzle

+0

これは意味がありませんでしたが、非効率的です。 feed_dictまたはreaderパイプラインを使用するか、両方を使用しないでください。バッチ関数(sess.runを呼び出すとき)から各バッチのfeed_dictにデータをコピーする時間が無駄になります。バッチ関数は、feed_dictの代わりにグラフに入る入力テンソルを提供します。 'a_q = tf.train.slice_input_producer([answers [trainfile]、questions [trainfile]、shuffle = False)'を使って試してください。テンソルが答える[trainfile]と質問[trainfile]が同じ順序であれば、a_q [0]とquestion a_q [1]は正しい順序でなければなりません。 – jpm

0

tf.train.range_input_producershuffleのような単一のキューを使用して、異なるデータにアクセスするために使用される整数を抽出しないのはなぜですか?

つまり、単一のキューを使用して、3つのデータ構造をすべて索引付けするために使用する整数を抽出します。

+0

イメージがメモリに読み込まれず、配列が大きすぎて大きすぎるため、配列としてアクセスできません。私は潜在的に最後の分までの画像の読み込みを保留し、代わりに文字列配列のインデックスを作成することができますが、私はバッチを先にロードすることができなかったので、かなり遅くなります。 – Amylizzle

関連する問題