I am trying to convert the shape property of a Tensor in Tensorflow 2.1 and I get this error:
AttributeError: 'Tensor' object has no attribute 'numpy'
I already checked that the output of tf.executing eagerly() is True,
A bit of context: I load a tf.data.Dataset from a TFRecords, then I apply a map. The maping function is trying to convert the shape property of one of the dataset sample Tensor to numpy:
def _parse_and_decode(serialized_example):
""" parse and decode each image """
features = tf.io.parse_single_example(
serialized_example,
features={
'encoded_image': tf.io.FixedLenFeature([], tf.string),
'kp_flat': tf.io.VarLenFeature(tf.int64),
'kp_shape': tf.io.FixedLenFeature([3], tf.int64),
}
)
image = tf.io.decode_png(features['encoded_image'], dtype=tf.uint8)
image = tf.cast(image, tf.float32)
kp_shape = features['kp_shape']
kp_flat = tf.sparse.to_dense(features['kp_flat'])
kp = tf.reshape(kp_flat, kp_shape)
return image, kp
def read_tfrecords(records_dir, batch_size=1):
# Read dataset from tfrecords
tfrecords_files = glob.glob(os.path.join(records_dir, '*'))
dataset = tf.data.TFRecordDataset(tfrecords_files)
dataset = dataset.map(_parse_and_decode, num_parallel_calls=batch_size)
return dataset
def transform(img, labels):
img_shape = img.shape # type: <class 'tensorflow.python.framework.ops.Tensor'>`
img_shape = img_shape.numpy() # <-- Throws the error
# ...
dataset = read_tfrecords(records_dir)
This throws the error:
dataset.map(transform, num_parallel_calls=1)
While this perfecly works:
for img, labels in dataset.take(1):
print(img.shape.numpy())
Edit: trying to access the img.numpy() instead of img.shape.numpy() results in the same behavior in the tranformer and the codde just above.
I checked the type of img_shape and it is <class 'tensorflow.python.framework.ops.Tensor'>.
Has anyone solved this sort of issue in new versions of Tensorflow?
imgcompletely defined? If its shape containsNonein any one of the dimensions, then this could happentf.io.decode_pngto parseimgso I'm guessing that the shape is known, isn't it? Also callingnumpy()onimginstead of it shape give me the same behavior... The weird thing is that all of this does not result in an error if I do this in elements fromdataset.take()instead of inside themap...