使用TensorFlow和Keras构建模型时fit方法输入形状匹配错误
解决输入形状不匹配的ValueError问题
这问题我之前调模型时也踩过坑,核心原因很直接:你的训练数据形状和模型定义的输入形状完全对不上。
问题拆解
你提到输入数据的形状是(345, 720, 120, 3),意味着:
- 345是样本数量
- 每张图片的尺寸是
720(高)×120(宽)×3(通道)
但你的模型第一层Lambda层定义的输入形状是(170,120,3),Keras在训练前会严格校验输入数据和模型输入的维度匹配度,自然就抛出了expected lambda_1_input to have shape (170, 120, 3)的错误。
两种解决方案
根据你的实际需求选一种就行:
方案1:调整输入数据到模型期望的尺寸
如果你确实想让模型接收170×120的图片,需要把所有训练图片的高度从720缩放到170。有两种方式:
- 在模型里加入预处理层(推荐,这样预处理会整合到模型中,部署时更方便):
from tensorflow.keras.layers import Resizing model = Sequential() # 先把720×120的图片缩放到170×120 model.add(Resizing(170, 120, input_shape=(720,120,3))) model.add(Lambda(lambda x: (x / 255.0) - 0.5)) model.add(Conv2D(24,(5,5),strides=(2,2),activation='relu')) # ... 后续层 - 提前预处理数据:
用OpenCV或Pillow批量调整图片尺寸,注意cv2.resize的参数是(宽, 高):import cv2 import numpy as np resized_X_train = np.array([cv2.resize(img, (120, 170)) for img in X_train]) # 之后用resized_X_train去训练
方案2:修改模型输入形状以匹配数据
如果你是不小心写错了输入形状,实际要处理的是720×120的图片,直接修正Lambda层的input_shape即可:
model = Sequential() model.add(Lambda(lambda x: (x / 255.0) - 0.5, input_shape=(720,120,3))) model.add(Conv2D(24,(5,5),strides=(2,2),activation='relu')) # ... 后续层
额外提醒
如果你用的是ImageDataGenerator或者tf.data.Dataset加载数据,也要确保数据加载器输出的图片尺寸和模型输入一致,比如ImageDataGenerator的target_size要设为(170,120)或(720,120),对应你的选择。
内容的提问来源于stack exchange,提问作者curious_girl
相关产品推荐
相关产品推荐

