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]
mogę wykorzystać dynamiczne kształty nauczenia warstw? Co stanie się z wagami, jeśli użyję mniejszego wejścia? – nouveau
Zazwyczaj kształty parametrów uczenia się muszą być znane statycznie, ale dane wejściowe mogą mieć zmienną wielkość partii. – mrry