2016-08-20 34 views
4

我想我的輸入層分割成不同大小的部分。我試圖使用tf.slice來做到這一點,但它不工作。Tensorflow:使用tf.slice拆分輸入

一些示例代碼:

import tensorflow as tf 
import numpy as np 

ph = tf.placeholder(shape=[None,3], dtype=tf.int32) 

x = tf.slice(ph, [0, 0], [3, 2]) 

input_ = np.array([[1,2,3], 
        [3,4,5], 
        [5,6,7]]) 

with tf.Session() as sess: 
     sess.run(tf.initialize_all_variables()) 
     print sess.run(x, feed_dict={ph: input_}) 

輸出:

[[1 2] 
[3 4] 
[5 6]] 

這工作和大致就是我希望發生的事情,但我必須指定(在這種情況下3)的第一個維度。我不知道,雖然多少矢量我會輸入,這就是爲什麼我使用的是placeholder在首位None

是否有可能使用slice以這樣的方式,當一個維度是未知的,直到運行時,它是否行得通呢?

我試過使用placeholder,它的值是ph.get_shape()[0],如下所示:x = tf.slice(ph, [0, 0], [num_input, 2])。但那也沒用。

回答

7

您可以在tf.slicesize參數中指定一個負的尺寸。負面維度告訴Tensorflow根據其他維度的決定動態確定正確的值。

import tensorflow as tf 
import numpy as np 

ph = tf.placeholder(shape=[None,3], dtype=tf.int32) 

# look the -1 in the first position 
x = tf.slice(ph, [0, 0], [-1, 2]) 

input_ = np.array([[1,2,3], 
        [3,4,5], 
        [5,6,7]]) 

with tf.Session() as sess: 
     sess.run(tf.initialize_all_variables()) 
     print(sess.run(x, feed_dict={ph: input_}) 
+1

尼斯。謝謝!奇怪的是,他們使用不一致的表示法('None'表示佔位符,對此不利)。 – Nimitz14

2

對於我來說,我嘗試另一個例子讓我明白切片功能

input = [ 
    [[11, 12, 13], [14, 15, 16]], 
    [[21, 22, 23], [24, 25, 26]], 
    [[31, 32, 33], [34, 35, 36]], 
    [[41, 42, 43], [44, 45, 46]], 
    [[51, 52, 53], [54, 55, 56]], 
    ] 
s1 = tf.slice(input, [1, 0, 0], [1, 1, 3]) 
s2 = tf.slice(input, [2, 0, 0], [3, 1, 2]) 
s3 = tf.slice(input, [0, 0, 1], [4, 1, 1]) 
s4 = tf.slice(input, [0, 0, 1], [1, 0, 1]) 
s5 = tf.slice(input, [2, 0, 2], [-1, -1, -1]) # negative value means the function cutting tersors automatically 
tf.global_variables_initializer() 
with tf.Session() as s: 
    print s.run(s1) 
    print s.run(s2) 
    print s.run(s3) 
    print s.run(s4) 

它輸出:

[[[21 22 23]]] 

[[[31 32]] 
[[41 42]] 
[[51 52]]] 

[[[12]] 
[[22]] 
[[32]] 
[[42]]] 

[] 

[[[33] 
    [36]] 
[[43] 
    [46]] 
[[53] 
    [56]]] 

參數開始表示你要開始哪​​個元素切。 大小參數表示在該維上有多少元素。