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.

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.


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.


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())

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]

apakah ada perbedaan antara kedua metode tersebut?
gota


1

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

tensor_shape = map(int, my_tensor.shape)

Ini mengubah semua Dimensionobjek menjadiint


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.