Keras使用自定义图像生成器训练时报错期望1输入却收到2个张量如何解决
报错原因排查
错误的核心诱因是自定义数据生成器的返回值格式不符合Keras接口要求:
- Keras中传入
model.fit()的生成器,每次迭代必须返回一个长度为2的元组(输入张量, 标签张量),你当前代码使用yield [X, y]返回了列表结构,Keras会将列表内的两个张量统一识别为模型的输入张量 - 你定义的模型只有1个输入节点,却收到了2个输入张量,因此触发参数不匹配的ValueError
可行解决方案
你只需要修改两处代码即可正常运行:
- 将生成器的返回值从列表改为元组,明确区分输入和标签
- 可选优化:将读取的uint8格式图像转换为float32格式并归一化到0~1区间,避免训练时数值溢出、loss计算异常
修改后的完整代码如下:
import numpy as np import cv2 from tensorflow.keras.models import Model from tensorflow.keras.layers import Conv2D, Input def load_image(file): image = cv2.imread(file, cv2.IMREAD_UNCHANGED) # 新增:归一化图像到0~1区间,转为float32 image = image.astype(np.float32) / 255.0 return image file = './B2.jpeg' def image_generator(image): i = 0 while True: X = image y = image X = np.expand_dims(X, axis=0) y = np.expand_dims(y, axis=0) i = i + 1 # 修改:返回元组而非列表 yield (X, y) inputs = Input(shape=(None, None, 3)) x = Conv2D(filters=3, kernel_size=3, padding='same', activation='relu', strides=1)(inputs) model = Model(inputs=inputs, outputs=x) model.compile(loss='mae', optimizer='adam') image = load_image(file) model.fit(image_generator(image), epochs=1)
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

