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

指定输入形状后训练CNN仍报输入形状不匹配错误求助

问题定位与解决方案

核心原因

问题不在模型定义环节,而是训练数据集train_data(及验证集val_data)输出的图片尺寸为(256,256,3),与模型要求的输入尺寸不匹配。你所谓的“确认输入图片尺寸符合要求”大概率是指原始图片尺寸,但数据加载/预处理阶段未执行resize操作,导致实际输入模型的图片仍为原始256尺寸。

具体排查与解决步骤

1. 检查数据集加载逻辑

如果使用ImageDataGenerator加载数据,必须在flow_from_directory或flow方法中明确指定target_size=(150,150):

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 训练集加载
train_datagen = ImageDataGenerator(rescale=1./255)
train_data = train_datagen.flow_from_directory(
    '你的训练集目录路径',
    target_size=(150, 150),  # 强制将图片resize为目标尺寸
    batch_size=32,
    class_mode='categorical'
)

# 验证集加载同理
val_datagen = ImageDataGenerator(rescale=1./255)
val_data = val_datagen.flow_from_directory(
    '你的验证集目录路径',
    target_size=(150, 150),
    batch_size=32,
    class_mode='categorical'
)

如果是自定义数据集加载代码,需确保读取图片后执行resize操作:

import cv2

# 示例:读取单张图片并调整尺寸
img = cv2.imread('图片路径.jpg')
img = cv2.resize(img, (150, 150))  # 必须添加此步骤统一尺寸

2. 验证数据集输出尺寸

训练前先打印数据集的输出形状,确认是否符合要求:

# 获取一个batch的数据查看形状
x_batch, y_batch = next(train_data)
print(x_batch.shape)  # 正常应输出 (batch_size, 150, 150, 3)

若输出为(batch_size,256,256,3),则可确认是数据集预处理环节的问题。

3. 额外注意事项

  • TensorFlow 1.14版本中,模型不会自动对输入数据进行resize,必须手动保证输入数据尺寸与模型input_shape完全一致;
  • 使用ImageDataGenerator的增强操作时,不要覆盖或遗漏target_size参数;
  • 自定义模型的input_shape仅为输入规范定义,不具备自动修正输入数据尺寸的能力。

补充:修正后的完整训练流程示例

# 1. 正确加载并预处理数据集
train_datagen = ImageDataGenerator(rescale=1./255)
train_data = train_datagen.flow_from_directory(
    './train_images',
    target_size=(150,150),
    batch_size=32,
    class_mode='categorical'
)

val_datagen = ImageDataGenerator(rescale=1./255)
val_data = val_datagen.flow_from_directory(
    './val_images',
    target_size=(150,150),
    batch_size=32,
    class_mode='categorical'
)

# 2. 定义并训练MobileNetV2模型
from tensorflow.keras.models import Model
base_model=tf.keras.applications.mobilenet_v2.MobileNetV2(include_top=False,weights=None,input_shape=(150,150,3))
x = base_model.output
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
predictions = tf.keras.layers.Dense(9,activation='softmax')(x)
model = Model(inputs = base_model.input,outputs=predictions)
model.compile(loss='categorical_crossentropy',metrics=["accuracy"],optimizer = tf.keras.optimizers.Adam())

history = model.fit(train_data,
                   epochs=5,
                   steps_per_epoch=len(train_data),
                   validation_data=val_data,
                   validation_steps=len(val_data))

内容的提问来源于stack exchange,提问作者J Song

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:25:42