Mapping a tensorflow dataset with a function object

I am having difficulties to understand why the following code doesn’t work and how to make it correct

import tensorflow as tf

ds = tf.data.Dataset.from_tensor_slices(([1,2,3,4,5],[6,7,8,9,10]))

class f:
    def __call__(self, couple):
        x,y = couple
        return x, y

fn = f()

out = ds.map(fn)

I get the error


TypeError: outer_factory.<locals>.inner_factory.<locals>.tf____call__() takes 2 positional arguments but 3 were given

Indeed, the following works

fn(next(ds.as_numpy_iterator()))

so I don’t understand why the first code wouldn’t work. Thank you for the help!

Hi @edamondo, when you print the dataset using as_numpy_iterator( ) it looks like

[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

when you apply map function, the function applies transformation to each element of this dataset

so when you apply the map function of the above dataset, for 1st iteration the values 1,6 are passed separately but in the above function you have defined only 1 argument for the 2 values. so the error was triggered.

You can modify the function as below to overcome the error

class f:
    def __call__(self, x, y):
        return x, y

Thank You.

1 Like

Hi Kiran,

Thank you for the answer. It works now. However, I don’t understand it conceptually. Indeed the first element of the dataset is the couple (1,6), the second element of the dataset is the couple (2,7) and so on, so it should be the couples that are inputted to the function and not the separated values right?

Hi @edamondo, If the first element has a series of elements each value is read individually. For example if you have 3 values like (1,2,3) you have to pass 3 variables.

class f:
    def __call__(self, x, y, z):
        return x, y, z

Thank You.

1 Like