104 votes

Comment obtenir les dimensions des tenseurs de Tensorflow (shape) en tant que valeurs int ?

Supposons que j'ai un tenseur Tensorflow. Comment puis-je obtenir les dimensions (forme) du tenseur sous forme de valeurs entières ? Je sais qu'il existe deux méthodes, tensor.get_shape() y tf.shape(tensor) mais je n'arrive pas à obtenir les valeurs de forme en tant qu'entier. int32 valeurs.

Par exemple, ci-dessous, j'ai créé un tenseur 2-D, et j'ai besoin d'obtenir le nombre de lignes et de colonnes en tant que int32 pour que je puisse appeler reshape() pour créer un tenseur de forme (num_rows * num_cols, 1) . Cependant, la méthode tensor.get_shape() renvoie des valeurs comme Dimension type, et non 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.

0voto

thushv89 Points 356

Dans les versions ultérieures (testées avec TensorFlow 1.14), il existe une méthode plus proche de celle de Numpy pour obtenir la forme d'un tenseur. Vous pouvez utiliser tensor.shape pour obtenir la forme du tenseur.

tensor_shape = tensor.shape
print(tensor_shape)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X