इंटेंस वैल्यू के रूप में टेंसरफ्लो टेंसर आयाम (आकार) कैसे प्राप्त करें?


90

मान लीजिए कि मेरे पास टेन्सरफ्लो टेंसर है। पूर्णांक मानों के रूप में मुझे टेंसर के आयाम (आकार) कैसे मिलते हैं? मुझे पता है कि दो तरीके हैं, tensor.get_shape()और tf.shape(tensor), लेकिन मुझे पूर्णांक int32मान के रूप में आकार मान नहीं मिल सकते हैं।

उदाहरण के लिए, नीचे मैंने एक 2-डी टेन्सर बनाया है, और मुझे पंक्तियों और स्तंभों की संख्या प्राप्त करने की आवश्यकता है int32ताकि मैं reshape()आकार के टेंसर बनाने के लिए कॉल कर सकूं (num_rows * num_cols, 1)। हालांकि, विधि tensor.get_shape()मानों को Dimensionटाइप के रूप में लौटाती है , नहीं 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.

जवाबों:


129

किलों की सूची के रूप में आकार प्राप्त करने के लिए, करें tensor.get_shape().as_list()

अपना tf.shape()कॉल पूरा करने के लिए , प्रयास करें tensor2 = tf.reshape(tensor, tf.TensorShape([num_rows*num_cols, 1]))। या आप सीधे tensor2 = tf.reshape(tensor, tf.TensorShape([-1, 1]))वहां कर सकते हैं जहां इसका पहला आयाम अनुमान लगाया जा सकता है।


धन्यवाद, जो मुझे कॉल करने और पूरा करने देता है tf.reshape(), लेकिन मैं वास्तव में प्राप्त करना चाहूंगा num_rowsऔर num_colsअन्य कार्यों के लिए पूर्णांक के रूप में।
stackoverflowuser2010

6
कोशिश करेंtensor.get_shape().as_list()
yuefengz

1
हाँ, as_list()काम करता है। कृपया इसे अपने उत्तर में जोड़ें, और मैं स्वीकार करूंगा।
stackoverflowuser2010

2
पूर्णता के लिए, यह कोड काम करता है:num_rows, num_cols = x.get_shape().as_list()
stackoverflowuser2010

1
अच्छा! मैं x.get_shape () के परिणाम डालने के लिए अजगर इंट () का उपयोग कर रहा था। यानी num_rows = int (x.get_shape () [1]), num_cols = int (x.get_shape () [2]), इत्यादि, उस pesky त्रुटि के आसपास पाने के लिए एक hacky थोड़े, लेकिन यह काम किया। मुझे एक बेहतर तरीके से
बताने


6

2-डी टेंसर के लिए, आप निम्नलिखित कोड का उपयोग करके पंक्तियों और स्तंभों की संख्या को इंट 32 के रूप में प्राप्त कर सकते हैं:

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

2
बहुत अयोग्य। यह पहले से प्रदान किए गए उत्तरों को कैसे जोड़ता है?
रेयिनेंग

4

2.0 संगत जवाब : में Tensorflow 2.x (2.1), आप पूर्णांक मान के रूप में टेंसर के आयाम (आकार) प्राप्त कर सकते हैं, जैसा कि नीचे दिए गए कोड में दिखाया गया है:

विधि 1 (उपयोग करके 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]

विधि 2 (उपयोग करते हुए 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]

क्या दोनों विधियों में कोई अंतर है?
gota


1

एक और सरल उपाय map()इस प्रकार है:

tensor_shape = map(int, my_tensor.shape)

यह सभी Dimensionवस्तुओं को धर्मान्तरित करता हैint


0

बाद के संस्करणों में (टेन्सरफ्लो १.१४ के साथ परीक्षण किया गया) एक टेंसर के आकार को प्राप्त करने के लिए एक और अधिक सुस्पष्ट तरीका है। आप tensor.shapeटेंसर का आकार प्राप्त करने के लिए उपयोग कर सकते हैं ।

tensor_shape = tensor.shape
print(tensor_shape)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.