2016-05-08 213 views
18

TensorFlow FAQ,它說:如何理解TensorFlow中的靜態形狀和動態形狀?

在TensorFlow,張量既有靜態(推斷)的形狀和 動態(真)的形狀。可以使用tf.Tensor.get_shape()方法讀取靜態形狀:此形狀從用於創建張量的 操作推斷,並且可能部分完成 。如果靜態形狀未完全定義,則可以通過評估tf.shape(t)來確定張量t的動態形狀 。

但是我仍然不能完全理解靜態形狀和動態形狀之間的關係。是否有任何示例顯示其差異?謝謝。

回答

27

有時,張量的形狀取決於在運行時計算的值。讓我們以下面的例子,其中x與四個元素定義爲tf.placeholder()向量:

x = tf.placeholder(tf.int32, shape=[4]) 
print x.get_shape() 
# ==> '(4,)' 

x.get_shape()的值是x靜態形狀,並且(4,)意味着它是一個長度爲4的矢量。現在,讓我們的tf.unique()運算應用到x

y, _ = tf.unique(x) 
print y.get_shape() 
# ==> '(?,)' 

(?,)意味着y未知長度的向量。爲什麼它是未知的? tf.unique(x)返回來自x的唯一值,並且x的值未知,因爲它是tf.placeholder(),所以它只有在提供它之前才具有值。讓我們來看看,如果你給兩個不同的值會發生什麼:

sess = tf.Session() 
print sess.run(y, feed_dict={x: [0, 1, 2, 3]}).shape 
# ==> '(4,)' 
print sess.run(y, feed_dict={x: [0, 0, 0, 0]}).shape 
# ==> '(1,)' 

希望這清楚地表明,張量可以有不同的靜態和動態形狀。動態形狀始終完全定義—它沒有?尺寸—但靜態形狀可能不太具體。這允許TensorFlow支持像tf.unique()tf.dynamic_partition()這樣的操作,它可以具有可變大小的輸出,並用於高級應用程序。

最後,tf.shape()運算可以用來獲得張量的動態形狀,並在TensorFlow計算使用它:

z = tf.shape(y) 
print sess.run(z, feed_dict={x: [0, 1, 2, 3]}) 
# ==> [4] 
print sess.run(z, feed_dict={x: [0, 0, 0, 0]}) 
# ==> [1] 
+0

我可以使用動態形狀與可學習幾層?如果我使用較小的輸入,會發生什麼? – nouveau

+3

通常,可學習參數的形狀需要靜態知道,但輸入可以具有可變的批量大小。 – mrry