Załóżmy, że mam tensor Tensorflow. Jak uzyskać wymiary (kształt) tensora jako wartości całkowite? Wiem, że istnieją dwie metody tensor.get_shape()
i tf.shape(tensor)
, ale nie mogę uzyskać wartości kształtu jako int32
wartości całkowitych .
Na przykład poniżej utworzyłem tensor 2-D i potrzebuję uzyskać liczbę wierszy i kolumn, int32
aby móc wywołać reshape()
funkcję tensora kształtu (num_rows * num_cols, 1)
. Jednak metoda tensor.get_shape()
zwraca wartości jako Dimension
typ, a nie int32
.
import tensorflow as tf
import numpy as np
sess = tf.Session()
tensor = tf.convert_to_tensor(np.array([[1001,1002,1003],[3,4,5]]), dtype=tf.float32)
sess.run(tensor)
# array([[ 1001., 1002., 1003.],
# [ 3., 4., 5.]], dtype=float32)
tensor_shape = tensor.get_shape()
tensor_shape
# TensorShape([Dimension(2), Dimension(3)])
print tensor_shape
# (2, 3)
num_rows = tensor_shape[0] # ???
num_cols = tensor_shape[1] # ???
tensor2 = tf.reshape(tensor, (num_rows*num_cols, 1))
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 1750, in reshape
# name=name)
# File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 454, in apply_op
# as_ref=input_arg.is_ref)
# File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 621, in convert_to_tensor
# ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
# File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 180, in _constant_tensor_conversion_function
# return constant(v, dtype=dtype, name=name)
# File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 163, in constant
# tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape))
# File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 353, in make_tensor_proto
# _AssertCompatible(values, dtype)
# File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 290, in _AssertCompatible
# (dtype.name, repr(mismatch), type(mismatch).__name__))
# TypeError: Expected int32, got Dimension(6) of type 'Dimension' instead.
źródło
tf.reshape()
, ale naprawdę chciałbym otrzymaćnum_rows
inum_cols
jako liczby całkowite dla innych operacji.tensor.get_shape().as_list()
as_list()
działa. Dodaj to do swojej odpowiedzi, a ja akceptuję.num_rows, num_cols = x.get_shape().as_list()
Inny sposób rozwiązania tego problemu wygląda następująco:
tensor_shape[0].value
To zwróci wartość int obiektu Dimension.
źródło
dla tensora 2-D można uzyskać liczbę wierszy i kolumn jako int32, używając następującego kodu:
rows, columns = map(lambda i: i.value, tensor.get_shape())
źródło
2.0 Zgodna odpowiedź : W programie
Tensorflow 2.x (2.1)
można uzyskać wymiary (kształt) tensora jako wartości całkowite, jak pokazano w poniższym kodzie:Metoda 1 (używanie
tf.shape
) :import tensorflow as tf c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) Shape = c.shape.as_list() print(Shape) # [2,3]
Metoda 2 (użycie
tf.get_shape()
) :import tensorflow as tf c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) Shape = c.get_shape().as_list() print(Shape) # [2,3]
źródło
Innym prostym rozwiązaniem jest użycie
map()
w następujący sposób:To konwertuje wszystkie
Dimension
obiekty naint
źródło
W późniejszych wersjach (testowanych z TensorFlow 1.14) istnieje bardziej zdrętwiały sposób na uzyskanie kształtu tensora. Możesz użyć,
tensor.shape
aby uzyskać kształt tensora.źródło