TensorFlow神经网络形状错误:张量包含批量大小导致维度不兼容
问题根源
tf.keras.utils.image_dataset_from_directory接口指定batch_size参数后,返回的数据集已经是按批量组装好的格式,单条数据的形状为(batch_size, height, width, 3)。你后续又手动调用了.batch()方法,相当于对已经分好批的数据集再次执行批量组装,额外新增了一个批量维度,所以模型收到的输入形状变成了(二次batch_size, 原始batch_size, height, width, 3),和模型要求的(None, height, width, 3)维度不匹配。
修复方案
直接删除两次手动调用.batch()的代码即可,修改数据集处理部分的代码如下:
# 以下两行是错误代码,直接删除即可 # train_ds = train_ds.batch(batch_size=batch_size, drop_remainder=True) # val_ds = val_ds.batch(batch_size=batch_size, drop_remainder=True) # 保留其余数据集处理代码,修改后完整逻辑如下 train_ds = train_ds.map( input_preprocess, num_parallel_calls=tf.data.AUTOTUNE) train_ds = train_ds.prefetch(tf.data.AUTOTUNE) val_ds = val_ds.map(input_preprocess)
如果需要实现丢弃不满一个批次的剩余样本的需求,直接在image_dataset_from_directory接口中添加drop_remainder=True参数即可:
train_ds = tf.keras.utils.image_dataset_from_directory( train_dir, labels='inferred', seed=42, image_size=(height, width), batch_size=batch_size, drop_remainder=True ) val_ds = tf.keras.utils.image_dataset_from_directory( val_dir, labels='inferred', seed=42, image_size=(height, width), batch_size=batch_size, drop_remainder=True )
可选优化
你已经在image_dataset_from_directory中指定了image_size参数,数据集加载时已经自动完成了尺寸调整,后续不需要再额外调用tf.image.resize做重复处理,可以删除对应的resize代码行,减少冗余计算。
内容的提问来源于stack exchange,提问作者MontyP
相关产品推荐
相关产品推荐

