首页 > 解决方案 > 类型错误:() 接受 1 个位置参数,但给出了 2 个

问题描述

这是我的代码:

img_gen = tf.keras.preprocessing.image.ImageDataGenerator()
gen = img_gen.flow_from_directory('/train/',(224, 224),'rgb', batch_size = 2)
training_set = tf.data.Dataset.from_generator(lambda : gen, output_types=(tf.float32, tf.float32), output_shapes = ([2,224,224,3],[2,2]))

def read_images(features):
    return features['image']

training_set = training_set.map(lambda x: read_images(x), num_parallel_calls=tf.data.experimental.AUTOTUNE)

错误是:

    TypeError: <lambda>() takes 1 positional argument but 2 were given 

那么如何解决函数 read_images 中的问题。

标签: tensorflow2.0tensorflow2.x

解决方案


flow_from_directory的文档-

返回
一个 DirectoryIterator 产生 (x, y) 的元组,其中 x 是一个 numpy 数组,其中包含一批形状为 (batch_size, *target_size, channels) 的图像,y 是一个对应标签的 numpy 数组。

您可以看到它返回一个包含 2 个元素的元组,因此您的 map 函数需要处理它。

def read_images(features):
    # some processing
    output = features
    return output

training_set = training_set.map(lambda image, label: read_images(image), num_parallel_calls=tf.data.experimental.AUTOTUNE)

ImageDataGenerator本身有很多可用的处理选项。您还可以查看 tensorflow 页面中的其他教程 -加载图像

查看数据集内容也有助于调试问题

for line in training_set.take(1):
    print(len(line))
    print(line)

推荐阅读