调用resnet_v2.preprocess_input时遇'_PrefetchDataset'无shape属性错误
解决方法:AttributeError: '_PrefetchDataset' object has no attribute 'shape'
问题根源
你直接把image_dataset_from_directory生成的Dataset对象传给了preprocess_input,但这个函数只接受张量(Tensor),不支持直接作用于Dataset类型,所以触发了报错。
两种可行的解决方式
方式1:用Dataset的map方法批量处理
直接对数据集对象使用map方法,将预处理函数应用到每个批次的图片上:
from tensorflow import keras # 原数据集加载代码保持不变 trainingdata = keras.utils.image_dataset_from_directory( directory='archive/chest_xray/train/', labels='inferred', label_mode='int', batch_size=32, image_size=(512,512) ) validationdata = keras.utils.image_dataset_from_directory( directory='archive/chest_xray/test/', labels='inferred', label_mode='int', batch_size=32, image_size=(512,512) ) # 定义预处理函数,处理每个批次的(图片, 标签)对 def preprocess_batch(image, label): return keras.applications.resnet_v2.preprocess_input(image), label # 将预处理逻辑映射到整个数据集 trainingdata = trainingdata.map(preprocess_batch) validationdata = validationdata.map(preprocess_batch)
方式2:把预处理整合到模型第一层
如果不想单独处理数据集,可以将预处理步骤作为模型的第一层,数据传入模型时会自动完成预处理:
from tensorflow import keras # 定义输入层 input_layer = keras.Input(shape=(512, 512, 3)) # 先执行预处理 preprocessed_input = keras.applications.resnet_v2.preprocess_input(input_layer) # 加载预训练ResNetV2,传入预处理后的张量作为输入 base_model = keras.applications.ResNet50V2(include_top=False, input_tensor=preprocessed_input) # 搭建后续分类层 x = base_model.output x = keras.layers.GlobalAveragePooling2D()(x) output_layer = keras.layers.Dense(1, activation='sigmoid')(x) # 组装完整模型 model = keras.Model(inputs=input_layer, outputs=output_layer)
补充说明
image_dataset_from_directory返回的是tf.data.Dataset类型,本质是批量数据的迭代器,并非单一张量,因此没有shape属性。而preprocess_input的设计目标是处理形状为(batch_size, height, width, channels)的张量,所以必须通过map映射到每个批次,或者整合到模型结构中完成预处理。
内容的提问来源于stack exchange,提问作者Lentemern
相关产品推荐
相关产品推荐

