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