TensorFlow加载图像数据时出现too many values to unpack错误如何解决
错误原因
tf.keras.preprocessing.image_dataset_from_directory() 单次调用仅返回1个tf.data.Dataset类型的对象,该对象是由批次化的(图像, 标签)元组组成的,你代码左侧要求解包出4个独立变量,和返回值结构完全不匹配,因此触发解包失败的报错。
修复步骤
- 第一步:分两次调用接口,通过参数指定分别生成训练集、测试集
- 第二步:通过
map方法对数据集做归一化,不能直接对Dataset对象做算术运算 - 第三步:如果需要提取全量的图像、标签数组,可对Dataset对象做拼接处理
修复后完整代码
import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt import pathlib data_dir = "C:/Users/efsol/OneDrive/Classification" data_dir = pathlib.Path(data_dir) image_count = len(list(data_dir.glob('*/*.jpg'))) print(image_count) print(data_dir.is_dir()) # 定义参数 batch_size = 32 img_height = 180 img_width = 180 val_split = 0.2 # 20%数据作为测试集 random_seed = 123 # 加载训练集 train_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=val_split, subset="training", seed=random_seed, image_size=(img_height, img_width), batch_size=batch_size) # 加载测试集 val_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=val_split, subset="validation", seed=random_seed, image_size=(img_height, img_width), batch_size=batch_size) # 归一化处理(适配Dataset结构) normalization_layer = layers.Rescaling(1./255) train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y)) # 【小数据集可选:提取全量图像、标签到numpy数组】 # train_images = tf.concat([x for x, y in train_ds], axis=0).numpy() # train_labels = tf.concat([y for x, y in train_ds], axis=0).numpy() # test_images = tf.concat([x for x, y in val_ds], axis=0).numpy() # test_labels = tf.concat([y for x, y in val_ds], axis=0).numpy()
额外说明
如果你的数据集不大,不需要批次训练,就可以打开注释里的拼接代码,直接得到和你最初预期格式一致的train_images/train_labels/test_images/test_labels四个变量。
内容的提问来源于stack exchange,提问作者Firuze Soltani
相关产品推荐
相关产品推荐

