Bagaimana cara mendapatkan dimensi tensor (bentuk) Tensorflow sebagai nilai int?

90

Misalkan saya memiliki tensor Tensorflow. Bagaimana cara mendapatkan dimensi (bentuk) tensor sebagai nilai integer? Saya tahu ada dua metode, tensor.get_shape()dan tf.shape(tensor), tetapi saya tidak bisa mendapatkan nilai bentuk sebagai int32nilai integer .

Misalnya, di bawah ini saya telah membuat tensor 2-D, dan saya perlu mendapatkan jumlah baris dan kolom int32sehingga saya dapat memanggil reshape()untuk membuat tensor bentuk (num_rows * num_cols, 1). Namun, metode ini tensor.get_shape()mengembalikan nilai sebagai Dimensiontipe, bukan 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.
stackoverflowuser2010
sumber

Jawaban:

128

Untuk mendapatkan bentuk sebagai daftar int, lakukan tensor.get_shape().as_list().

Untuk menyelesaikan tf.shape()panggilan Anda , coba tensor2 = tf.reshape(tensor, tf.TensorShape([num_rows*num_cols, 1])). Atau Anda bisa langsung melakukan di tensor2 = tf.reshape(tensor, tf.TensorShape([-1, 1]))mana dimensi pertamanya bisa disimpulkan.

yuefengz
sumber
Terima kasih, itu memungkinkan saya menelepon dan menyelesaikan tf.reshape(), tetapi saya benar-benar ingin mendapatkan num_rowsdan num_colssebagai bilangan bulat untuk operasi lain.
stackoverflowuser2010
6
Cobatensor.get_shape().as_list()
yuefengz
1
Yup, as_list()berhasil. Tolong tambahkan ke jawaban Anda, dan saya akan menerimanya.
stackoverflowuser2010
2
Untuk kelengkapan, kode ini berfungsi:num_rows, num_cols = x.get_shape().as_list()
stackoverflowuser2010
1
Bagus! Saya menggunakan python int () untuk menampilkan hasil x.get_shape (). yaitu num_rows = int (x.get_shape () [1]), num_cols = int (x.get_shape () [2]), dll. Ya, agak sulit untuk mengatasi kesalahan yang mengganggu itu, tetapi berhasil. Terima kasih telah mencerahkan saya ke cara yang lebih baik :-)
SherylHohman
31

Cara lain untuk mengatasinya adalah seperti ini:

tensor_shape[0].value

Ini akan mengembalikan nilai int dari objek Dimension.

tijmen Verhulsdonck
sumber
6

untuk tensor 2-D, Anda bisa mendapatkan jumlah baris dan kolom sebagai int32 menggunakan kode berikut:

rows, columns = map(lambda i: i.value, tensor.get_shape())
Anna
sumber
2
Sangat janggal. Bagaimana ini menambah jawaban yang sudah disediakan?
rayryeng
4

2.0 Jawaban Kompatibel : Dalam Tensorflow 2.x (2.1), Anda bisa mendapatkan dimensi (bentuk) dari tensor sebagai nilai integer, seperti yang ditunjukkan pada Kode di bawah ini:

Metode 1 (menggunakan 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]

Metode 2 (menggunakan 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]
Dukungan Tensorflow
sumber
apakah ada perbedaan antara kedua metode tersebut?
gota
Silakan merujuk stackoverflow.com/a/37096395/11530462
Dukungan Tensorflow
1

Solusi sederhana lainnya adalah dengan menggunakan map()sebagai berikut:

tensor_shape = map(int, my_tensor.shape)

Ini mengubah semua Dimensionobjek menjadiint

Achille Huet
sumber
0

Di versi yang lebih baru (diuji dengan TensorFlow 1.14), ada cara yang lebih numpy untuk mendapatkan bentuk tensor. Anda bisa menggunakan tensor.shapeuntuk mendapatkan bentuk tensor.

tensor_shape = tensor.shape
print(tensor_shape)
thushv89.dll
sumber