使用混合精度训练模型时遇ValueError:Target data is missing问题求助
问题分析与解决方案
核心原因
你遇到的ValueError: Target data is missing错误,本质是训练/验证数据集没有返回包含输入特征和目标标签的二元组。尽管Keras文档说明使用Dataset对象时可以省略y参数,但前提是Dataset必须以(input_tensor, label_tensor)的结构返回每一批数据。如果你的数据集只生成了输入图像,没有附带标签,Keras就无法找到计算sparse_categorical_crossentropy所需的目标数据。
排查与修复步骤
1. 验证数据集结构
先确认你的train_data是否包含标签:
# 取一批数据检查结构 for batch in train_data.take(1): print(f"批次元素数量: {len(batch)}") if len(batch) == 2: print("输入形状:", batch[0].shape) print("标签形状:", batch[1].shape) else: print("数据集未返回标签")
如果输出显示“数据集未返回标签”,说明问题出在数据集构建阶段。
2. 修正数据集构建代码
如果你是用tf.keras.utils.image_dataset_from_directory构建数据集,确保正确设置label_mode参数(对应sparse_categorical_crossentropy需要设为'int'):
train_data = tf.keras.utils.image_dataset_from_directory( directory=你的训练集路径, image_size=(224, 224), batch_size=32, # 根据你的需求调整 label_mode='int' # 必须设置为'int',返回整数类型标签 ) test_data = tf.keras.utils.image_dataset_from_directory( directory=你的测试集路径, image_size=(224, 224), batch_size=32, label_mode='int' )
如果是自定义数据集(比如继承tf.data.Dataset),确保返回的是(图像张量, 标签张量)的二元组,而非单独的图像张量。
3. 其他注意事项
- 你的模型编译代码是正确的:
sparse_categorical_crossentropy对应整数标签,和label_mode='int'的数据集匹配。 - 混合精度配置:如果还没启用混合精度,需要在代码开头添加:
你已经在输出层设置了import tensorflow as tf tf.keras.mixed_precision.set_global_policy('mixed_float16')dtype=tf.float32,这是正确的(避免softmax输出精度丢失)。
内容的提问来源于stack exchange,提问作者Rajan Iyer
相关产品推荐
相关产品推荐

