Tensorflow tensör boyutlarını (şekil) int değerleri olarak nasıl elde edebilirim?


90

Bir Tensorflow tensörüm olduğunu varsayalım. Tensörün boyutlarını (şeklini) tam sayı değerleri olarak nasıl elde ederim? Ben iki yöntem vardır biliyorum tensor.get_shape()ve tf.shape(tensor)ama tamsayı olarak şekil değerlerini alamayan int32değerler.

Örneğin, aşağıda 2 boyutlu bir tensör oluşturdum ve bir şekil tensörü oluşturmak için int32arayabilmem reshape()için satır ve sütun sayısını almam gerekiyor (num_rows * num_cols, 1). Ancak, yöntem tensor.get_shape()değerleri Dimensiontür olarak döndürür , değil 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.

Yanıtlar:


128

Şekli bir içler listesi olarak almak için yapın tensor.get_shape().as_list().

tf.shape()Aramanızı tamamlamak için deneyin tensor2 = tf.reshape(tensor, tf.TensorShape([num_rows*num_cols, 1])). Veya doğrudan tensor2 = tf.reshape(tensor, tf.TensorShape([-1, 1]))ilk boyutunun çıkarsanabileceği yeri yapabilirsiniz.


Teşekkürler, bu aramama ve tamamlamama izin veriyor tf.reshape(), ancak diğer işlemler için gerçekten num_rowsve num_colstam sayı olarak almak istiyorum .
stackoverflowuser2010

6
Deneyintensor.get_shape().as_list()
yuefengz

1
Evet, as_list()çalışıyor. Lütfen cevabınıza ekleyin, ben de kabul edeceğim.
stackoverflowuser2010

2
num_rows, num_cols = x.get_shape().as_list()
stackoverflowuser2010

1
Güzel! X.get_shape () sonuçlarını yayınlamak için python int () kullanıyordum. yani num_rows = int (x.get_shape () [1]), num_cols = int (x.get_shape () [2]), vb. Evet, bu sinir bozucu hatayı aşmak için biraz hilekar, ama işe yaradı. Beni daha iyi bir şekilde aydınlattığınız için teşekkürler :-)
SherylHohman

31

Bunu çözmenin başka bir yolu şudur:

tensor_shape[0].value

Bu, Dimension nesnesinin int değerini döndürür.


6

2 boyutlu bir tensör için, aşağıdaki kodu kullanarak satır ve sütun sayısını int32 olarak alabilirsiniz:

rows, columns = map(lambda i: i.value, tensor.get_shape())

2
Hiç hoş değil. Bu, önceden verilen cevaplara nasıl eklenir?
rayryeng

4

2.0 Uyumlu Cevap : Tensorflow 2.x (2.1)içinde, tensörün boyutlarını (şeklini) aşağıdaki Kodda gösterildiği gibi tamsayı değerleri olarak alabilirsiniz:

Yöntem 1 (kullanarak 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]

Yöntem 2 (kullanarak 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]

iki yöntem arasında herhangi bir fark var mı?
gota


1

Diğer bir basit çözüm, map()aşağıdaki gibi kullanmaktır :

tensor_shape = map(int, my_tensor.shape)

Bu, tüm Dimensionnesneleriint


0

Daha sonraki sürümlerde (TensorFlow 1.14 ile test edilmiştir) bir tensör şeklini almanın daha uyuşuk bir yolu vardır. tensor.shapeTensörün şeklini almak için kullanabilirsiniz .

tensor_shape = tensor.shape
print(tensor_shape)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.