2017-05-14 29 views
0

假設我讀過的文件名imgfiles_op及其相應的標籤labels_op的張量,我能看到打印與文件名後面的標籤有以下摘錄的batch_size一個一個的batch_size時:如何拼接在tenforflow 2張量

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 

    for i in range(2): 
     print ("Batch= ", i) 
     pair = tf.convert_to_tensor([imgfiles_op, labels_op]).eval() 

     print ('imgfile=%s, label=%s' % (pair[0], 
             pair[1])) 

    coord.request_stop() 
    coord.join(threads) 

我的問題是如何獲得像這種格式的打印:"<filename> <label>"。 我沒有得到以下工作,並且運行這個只是掛起。我的想法是列出這樣的對。所以'pair_list'的大小應該是batch_size。

for i in range(2): 
     print ("Batch= ", i) 
     pair_list_op = tf.train.slice_input_producer([imgfiles_op, labels_op], 
                shuffle=False) 
     pair_list = sess.run(pair_list_op) 
     for p in pair_list: 
      print ('imgfile=%s, label=%s' % (p[0], 
              p[1])) 

問題: 1.爲什麼第二個代碼段掛起?有沒有一種確保任何TF代碼不會掛起的好方法?這種效果令新TF用戶感到沮喪。

  1. 當然,我可以做到這一點蟒蛇的方式,但我不知道什麼是TF方式這樣做。

謝謝!

回答

1

一個可能的解決方案可能是這樣的:

p1 = tf.constant(['f1','f2','f3']) 
p2 = tf.constant(['1','0','1']) 
p3 = tf.stack([p1, p2]) 
p4 = tf.stack([p1, p2],axis=1) 
sess = tf.Session() 
print(sess.run(p3)) 
print(sess.run(p4)) 

輸出:

array([['f1', 'f2', 'f3'], 
     ['1', '0', '1']], dtype=object) 

array([['f1', '1'], 
     ['f2', '0'], 
     ['f3', '1']], dtype=object) 

在第二種情況下(P4),你可以看到你指定的文件名和標籤可以出現。你可以堆疊image_filenames和axis = 1的標籤。

這是否幫助你?

+0

謝謝! tf.stack()有幫助!但我想知道更多爲什麼slice_input_producer()不起作用,特別是爲什麼程序掛起。 – galactica

+0

@galactica,我不確定你爲什麼把圖形放在for循環中。 slice_input_producer是一個圖形節點。 for循環應該在sess.run之前。如果你運行sess.run(pair_list_op) - 它應該產生結果。但是,再一次,你最終會以python的方式進行操作。我猜,tf.stack()對你來說是更好的選擇。 – hars