2017-06-26 46 views
3

我想切片[3.0,33.0]。我試圖通過以下代碼訪問此切片。我不太清楚tf.slice命令。我不清楚關於這個命令的文檔中提到的開始和大小。有人可以讓它容易理解。如何切片張量的一部分?

batch = tf.constant([ 
    [#First image 
    [[0.0,10.0],[1.0,11.0]], 
    [[3.0,33.0],[4.0,44.0]] 
    ], 
    [#Second image 
    [[5.0,55.0],[6.0,66.0]], 
    [[7.0,77.0],[8.0,88.0]] 
    ] 
]) 
slice1 = tf.slice(batch,[0,0,0,0], [0,0,1,0]) 
sess = tf.InteractiveSEssion() 
sess.run(tf.initialize_all_variables()) 
print slice1.eval() 

回答

3

我將解釋與例子來支持你的代碼,所以我創造了一些案件,但首先我將解釋tf.slice(input, begin, size) parametters:

  • input是裁判張量。
  • begin是從片開始的索引。
  • size是切片的偏移量。

所以tf.slice作品從input選擇子張量始於begin索引和結束在begin + size,治療beginsize作爲索引向量。下面的例子將闡明這一點:

batch = tf.constant([ 
     [#First image 
      [ 
       [0.0,10.0], 
       [1.0,11.0] 
      ], 
      [ 
       [3.0,33.0], 
       [4.0,44.0] 
      ] 
     ], 
     [#Second image 
      [ 
       [5.0,55.0], 
       [6.0,66.0] 
      ], 
      [ 
       [7.0,77.0], 
       [8.0,88.0] 
      ] 
     ] 
    ]) 
slice1 = tf.slice(batch,[0,0,0,0], [1,1,1,1]) 
slice2 = tf.slice(batch,[0,1,0,0], [1,1,2,2]) 
slice3 = tf.slice(batch,[1,1,1,0], [1,1,1,2]) 
slice4 = tf.slice(batch,[0,0,0,0], [2,2,2,2]) 
sess = tf.InteractiveSession() 
print("slice1: \n" + str(slice1.eval()) + "\n") 
print("slice2: \n" + str(slice2.eval()) + "\n") 
print("slice3: \n" + str(slice3.eval()) + "\n") 
print("slice4: \n" + str(slice4.eval()) + "\n") 

在這種情況下的輸出是:

slice1: 
[[[[ 0.]]]] 

slice2: 
[[[[ 3. 33.] 
    [ 4. 44.]]]] 

slice3: 
[[[[ 8. 88.]]]] 

slice4: 
[[[[ 0. 10.] 
    [ 1. 11.]] 

    [[ 3. 33.] 
    [ 4. 44.]]] 


[[[ 5. 55.] 
    [ 6. 66.]] 

    [[ 7. 77.] 
    [ 8. 88.]]]] 
  • slice1選擇張量的第一個元素,因爲它開始[0,0,0,0]並挑選只有一個元素。
  • slice2選擇張量的第一個元素,因爲它在[0,1,0,0]上開始,並在兩個第一維中選取1個元素,在三維和四維中選取2個。
  • slice3選擇張量的第一個元素,因爲它開始[1,1,1,0]並挑選在三個第一維度2中的最後只有1元件和。
  • slice4選擇張量的所有的元件,因爲它開始[0,0,0,0]和兩個元件由尺寸,因此它覆蓋了所有的張量

注意,尺寸的去數目在所有的幻燈片相同的。如果你只用一個元素去除尺寸,你可以使用tf.squeeze

+0

感謝您的詳細解釋 – rida