You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:09:01