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

Related to UnimplementedError: Cast string to float is not supported

1. Why am I getting an "UnimplementedError: Cast string to float is not supported" error?

This error occurs when you are trying to convert a string to a float using a method or function that does not support this conversion.

2. How can I fix the "UnimplementedError: Cast string to float is not supported" error?

To fix this error, you can try using a different method or function to convert the string to a float that supports this conversion. Alternatively, you can first convert the string to an integer and then convert the integer to a float.

3. Can I convert a string to a float in Python?

Yes, you can convert a string to a float in Python using the float() function. However, you need to ensure that the string can be converted to a float, otherwise you may encounter the "UnimplementedError: Cast string to float is not supported" error.

4. What are some common reasons for getting the "UnimplementedError: Cast string to float is not supported" error?

Some common reasons for getting this error include trying to convert a string that contains non-numeric characters or special characters to a float, using a method or function that does not support this conversion, or trying to convert a string that is too large to a float.

5. Is there a workaround for the "UnimplementedError: Cast string to float is not supported" error?

One workaround for this error is to first convert the string to an integer using the int() function and then convert the integer to a float. This can help avoid the error if the string contains only numeric characters that can be converted to an integer.

Similar threads

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