UnimplementedError: Cast string to float is not supported

In summary, the speaker encountered an error while trying to create a dataset using two different image folders and train a cycleGAN model. They shared their code and the error message, and received advice to search for a solution in the context of Tensorflow or file a bug report. Ultimately, they discovered that the problem was caused by reading the file as a string rather than a tensor, and were able to resolve it by using tf.image.decode_png to convert it to a tensor.
  • #1
BRN
108
10
Hello everyone,
I have this problem that I can't solve:

I have two types of images contained in two different folders. I have to create a dataset with these images and train a cycleGAN model, but for simplicity we assume that I want to print them on monitor and forget the cycleGAN.

My code is this:
load and print:
input_path_A = './data/img_test_A/'
input_path_B = './data/img_test_B/'
EPOCHS = 50
buffer_size = 1000
batch_size = 2

def load_and_norm(filename):

    img = tf.io.read_file(filename)
    img = tf.cast(img, tf.float32) / 127.5 - 1 # normalization to [-1, 1]
    
    return img
    
def load_dataset(ds_folder, batch_size, buffer_size):

    img_filenames = tf.data.Dataset.list_files(os.path.join(ds_folder, "*.png"))
    img_dataset = img_filenames.map(load_and_norm)
    
    img_dataset = img_dataset.batch(batch_size).shuffle(buffer_size)
    
    return img_dataset

def show_img(dataset1, dataset2):
    iterator1 = iter(dataset1)
    iterator2 = iter(dataset2)
    
    num_rows = 4
    num_cols = 2
    
    fig, axs = plt.subplots(num_rows, num_cols, figsize=(10, 10))
    axs = axs.flatten()
    
    for i in range(num_rows*num_cols):
        image1 = next(iterator1)
        image2 = next(iterator2)
        
        axs[i].imshow(image1)
        axs[i+num_cols].imshow(image2)
        
    plt.show()

I receive this error:
error:
2023-03-20 18:37:30.450694: W tensorflow/core/framework/op_kernel.cc:1722] OP_REQUIRES failed at cast_op.cc:121 : UNIMPLEMENTED: Cast string to float is not supported

---------------------------------------------------------------------------
UnimplementedError                        Traceback (most recent call last)
/tmp/ipykernel_18739/534026073.py in <module>
      2     print("Starting epoch", epoch + 1)
      3
----> 4     for x, y in train_dataset:
      5         show_img(x, y)

~/.local/lib/python3.9/site-packages/tensorflow/python/data/ops/dataset_ops.py in __iter__(self)
    488     if context.executing_eagerly() or ops.inside_function():
    489       with ops.colocate_with(self._variant_tensor):
--> 490         return iterator_ops.OwnedIterator(self)
    491     else:
    492       raise RuntimeError("`tf.data.Dataset` only supports Python-style "

~/.local/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py in __init__(self, dataset, components, element_spec)
    724             "When `dataset` is provided, `element_spec` and `components` must "
    725             "not be specified.")
--> 726       self._create_iterator(dataset)
    727
    728     self._get_next_call_count = 0

~/.local/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py in _create_iterator(self, dataset)
    749               output_types=self._flat_output_types,
    750               output_shapes=self._flat_output_shapes))
--> 751       gen_dataset_ops.make_iterator(ds_variant, self._iterator_resource)
    752       # Delete the resource when this object is deleted
    753       self._resource_deleter = IteratorResourceDeleter(

~/.local/lib/python3.9/site-packages/tensorflow/python/ops/gen_dataset_ops.py in make_iterator(dataset, iterator, name)
   3239       return _result
   3240     except _core._NotOkStatusException as e:
-> 3241       _ops.raise_from_not_ok_status(e, name)
   3242     except _core._FallbackException:
   3243       pass

~/.local/lib/python3.9/site-packages/tensorflow/python/framework/ops.py in raise_from_not_ok_status(e, name)
   7105 def raise_from_not_ok_status(e, name):
   7106   e.message += (" name: " + name if name is not None else "")
-> 7107   raise core._status_to_exception(e) from None  # pylint: disable=protected-access
   7108
   7109

UnimplementedError: Cast string to float is not supported
     [[{{node Cast}}]] [Op:MakeIterator]

I don't understand what the problem is, but I think it is due to how the dataset is created.

How can it be resolved?

Thank you all.
 
Technology news on Phys.org
  • #2
I think you should try to search on this error in the context of Tensorflow as there is either a bug report on it or someone else has figured out what went wrong.

If not then you should file a bug report with Tensorflow.
 
  • Like
Likes BRN
  • #3
For example, googling "tensorflow cast string to float" returns a lot of hits.
 
  • Like
Likes BRN, Vanadium 50 and jedishrfu
  • #4
You could try downloading your training data again in case it got corrupted somehow.

Also check if there are any updates to tensorflow that you haven't installed.
 
  • #5
BRN said:
Hello everyone,
I have this problem that I can't solve:

I have two types of images contained in two different folders. I have to create a dataset with these images and train a cycleGAN model, but for simplicity we assume that I want to print them on monitor and forget the cycleGAN.

My code is this:
load and print:
def load_and_norm(filename):

    img = tf.io.read_file(filename)
    img = tf.cast(img, tf.float32) / 127.5 - 1 # normalization to [-1, 1]
   
    return img
tf.io.read_file reads the file as a string, and not as a tensor.
You'll need tf.io.decode_png to convert it to a tensor
https://www.tensorflow.org/api_docs/python/tf/io/decode_png
 
  • Like
Likes jedishrfu and BRN
  • #6
willem2 said:
tf.io.read_file reads the file as a string, and not as a tensor.
You'll need tf.io.decode_png to convert it to a tensor
https://www.tensorflow.org/api_docs/python/tf/io/decode_png
That's right, this was the problem.

Here the correct code

correct code:
def load_and_norm(filename):

    img = tf.io.read_file(filename) # get only filename string
    img = tf.image.decode_png(img, channels = 3) # necesary converting to tensor
    img = tf.cast(img, tf.float32) / 127.5 - 1 # normalization to [-1, 1]
    
    return img

Thank you all!
 
  • Like
Likes berkeman

What is an UnimplementedError?

An UnimplementedError is an error that occurs when attempting to use a feature or function that has not yet been fully implemented or developed. This can happen in programming languages, software applications, or other technological systems.

What does "Cast string to float is not supported" mean?

This means that the action of converting a string (a sequence of characters) to a float (a numerical data type with decimal points) is not supported or possible. This could be due to limitations in the programming language or conflicts with other code.

Why am I getting this error?

You are getting this error because you have attempted to convert a string to a float, but the code or system you are using does not have the capability to perform this action. This could be due to the code being incomplete or not yet fully developed.

How can I fix this error?

The best way to fix this error is to wait for the feature or function to be implemented in the code or system you are using. In the meantime, you can try finding an alternative way to achieve the same result without converting a string to a float. You can also report the error to the developers so they can work on fixing it.

Is there a way to avoid this error in the future?

If you are aware that a certain feature or function is not yet fully implemented, you can avoid this error by not using that feature or function. Alternatively, you can also check for updates or patches from the developers to see if the issue has been resolved in the latest version.

Similar threads

  • Programming and Computer Science
Replies
3
Views
1K
Back
Top