2016-05-08 13 views
18

W TensorFlow FAQ, to mówi:Jak zrozumieć kształt statyczny i kształt dynamiczny w TensorFlow?

W TensorFlow, tensora ma zarówno statycznych (wywieść) kształt i dynamicznego (true) kształt. Statyczny kształt można odczytać za pomocą metody tf.Tensor.get_shape(): ten kształt wywodzi się z operacji , które zostały użyte do utworzenia tensora i może być częściowo zakończony w postaci . Jeżeli statyczny kształt nie jest w pełni zdefiniowany, dynamiczny kształt tensora t można określić, oceniając tf.shape (t).

Ale wciąż nie mogę w pełni zrozumieć związku między statycznym kształtem a dynamicznym kształtem. Czy są jakieś przykłady pokazujące ich różnice? Dzięki.

Odpowiedz

27

Czasami kształt tensora zależy od wartości wyliczonej w czasie wykonywania. Weźmy następujący przykład, w którym x jest zdefiniowany jako tf.placeholder() wektor czterech elementów:

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

Wartość x.get_shape() jest statycznym kształt x i (4,) znaczy, że jest wektorem o długości 4. teraz stosuje tf.unique() op x

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

(?,) oznacza, że ​​y jest wektorem o nieznanej długości. Dlaczego jest nieznany? tf.unique(x) zwraca unikatowe wartości z x, a wartości x są nieznane, ponieważ jest to tf.placeholder(), więc nie ma wartości do momentu jej podania. Zobaczmy, co się stanie, jeśli karmisz dwie różne wartości:

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,)' 

Mam nadzieję, że to wyjaśnia, że ​​tensor może mieć inny kształt statycznej i dynamicznej. Kształt dynamiczny jest zawsze w pełni zdefiniowany — nie ma wymiarów , ale kształt statyczny może być mniej konkretny. Dzięki temu TensorFlow może obsługiwać operacje takie jak tf.unique() i tf.dynamic_partition(), które mogą mieć wyjścia o zmiennej wielkości i są używane w zaawansowanych aplikacjach.

Wreszcie tf.shape() op może być używany, aby uzyskać dynamiczny kształt tensora i używać go w obliczeniach 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

mogę wykorzystać dynamiczne kształty nauczenia warstw? Co stanie się z wagami, jeśli użyję mniejszego wejścia? – nouveau

+3

Zazwyczaj kształty parametrów uczenia się muszą być znane statycznie, ale dane wejściowe mogą mieć zmienną wielkość partii. – mrry