在TensorFlow FAQ,它說:如何理解TensorFlow中的靜態形狀和動態形狀?
在TensorFlow,張量既有靜態(推斷)的形狀和 動態(真)的形狀。可以使用tf.Tensor.get_shape()方法讀取靜態形狀:此形狀從用於創建張量的 操作推斷,並且可能部分完成 。如果靜態形狀未完全定義,則可以通過評估tf.shape(t)來確定張量t的動態形狀 。
但是我仍然不能完全理解靜態形狀和動態形狀之間的關係。是否有任何示例顯示其差異?謝謝。
在TensorFlow FAQ,它說:如何理解TensorFlow中的靜態形狀和動態形狀?
在TensorFlow,張量既有靜態(推斷)的形狀和 動態(真)的形狀。可以使用tf.Tensor.get_shape()方法讀取靜態形狀:此形狀從用於創建張量的 操作推斷,並且可能部分完成 。如果靜態形狀未完全定義,則可以通過評估tf.shape(t)來確定張量t的動態形狀 。
但是我仍然不能完全理解靜態形狀和動態形狀之間的關係。是否有任何示例顯示其差異?謝謝。
有時,張量的形狀取決於在運行時計算的值。讓我們以下面的例子,其中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]
我可以使用動態形狀與可學習幾層?如果我使用較小的輸入,會發生什麼? – nouveau
通常,可學習參數的形狀需要靜態知道,但輸入可以具有可變的批量大小。 – mrry