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

为何Keras内置与自定义生成器读取同图得到不同numpy数组?

Keras内置生成器与自定义生成器输出数组不一致的排查与解决

我之前也碰到过类似的问题——视觉上图片看起来完全一样,但numpy数组就是有差异,最终导致模型性能差很多。结合你的代码和描述,我整理了几个关键的排查点和修复方案:

1. 最可能的原因:图像resize参数未对齐

你的Keras内置生成器flow_from_dataframe里明确指定了两个影响像素值的关键参数:

  • target_size=(img_size, img_size):强制将图片缩放到256x256尺寸
  • interpolation='nearest':使用最近邻插值完成缩放逻辑

但你的自定义生成器DataGenerator3里的load_img调用完全没指定这两个参数:

img = load_img(img_row)  # 未传target_size和interpolation

默认情况下:

  • load_img不会自动缩放图片,若原始图片尺寸不是256x256,这里会直接读取原尺寸,赋值到预设的256x256数组时会报错(你没报错说明原图片刚好是256x256,但这是侥幸情况);
  • load_img的默认插值方式是bilinear,和你内置生成器用的nearest完全不同——即使图片尺寸一致,插值逻辑的差异(比如边缘像素处理)也会导致像素值出现细微差别,这些差别在模型训练中会被放大,最终导致误差飙升。

修复方案

修改__data_generation里的load_img调用,严格对齐参数:

img = load_img(img_row, target_size=self.dim[:2], interpolation='nearest')

2. 浮点精度的细微差异

即使所有预处理逻辑完全对齐,由于浮点计算的精度问题,两个生成器输出的数组也可能无法通过np.array_equal的严格比较(它要求每个元素完全一致)。你可以用np.allclose做宽松比较,允许极小的误差范围:

print(np.allclose(img1, img2, atol=1e-6))  # 元素差异小于1e-6即返回True

如果这个返回True,说明视觉一致的背后,数值差异只是浮点精度问题,不会影响模型性能;如果返回False,说明还有其他预处理逻辑没对齐。

3. 额外的一致性检查

  • 显式指定颜色模式:虽然你已经用了color_mode='rgb'和默认RGB的load_img,但可以显式添加color_mode='rgb'参数到load_img中,避免潜在的默认值变化;
  • 确认数据类型:你的自定义生成器里把X转成了float32,和Keras内置生成器的输出类型一致,这部分是正确的;
  • 索引逻辑验证:自定义生成器里的n_index是子数据框的迭代索引,由于batch_size=1,这里没问题,但如果batch_size更大,要确保不会出现索引越界或者赋值错误。

把这些调整后,再测试两个生成器的输出数组,应该就能对齐了,模型误差也会回到和内置生成器一致的水平。

内容的提问来源于stack exchange,提问作者Joey Fueng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:28:24