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

如何在自定义tf.keras Sequence DataGenerator中实现像素缩放并修复UFuncTypeError?

解决自定义DataGenerator的UFuncTypeError问题

你碰到的这个错误很典型——你在对存储图片路径的字符串数组执行数值乘法操作,这肯定会触发类型不匹配的错误,因为字符串和浮点数没法直接做乘法运算。

错误原因分析

看你代码里的这一行:

batch_x = batch_x*1/255

这里的batch_x是从x_set(图片路径列表)截取出来的子列表转成的数组,元素全是字符串格式的文件路径,对字符串执行*1/255操作完全不符合逻辑,这就是报错的根源。

正确的修改方案

归一化操作应该放在读取并加载图片之后,也就是等你把图片路径转换成实际的像素数组后,再对像素值做缩放。以下是修正后的完整代码:

import math
import numpy as np
from PIL import Image  # 假设你用的是PIL的resize,其他库可对应调整

class DataGenerator(Sequence):
    def __init__(self, x_set, y_set, batch_size):
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size

    def __len__(self):
        return math.ceil(len(self.x) / self.batch_size)

    def __getitem__(self, idx):
        # 获取当前batch的图片路径和标签
        batch_paths = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
        batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]
        
        # 读取图片、resize并执行归一化
        batch_x = np.array([
            np.array(Image.open(file_name).resize((64, 128)), dtype=np.float32) * 1./255
            for file_name in batch_paths
        ])
        
        return batch_x, np.array(batch_y)

关键修改点说明

  1. 移除无效的路径数组运算:删掉了原来对batch_x(路径数组)的*1/255操作,因为那是字符串数组,不支持数值运算。
  2. 移归一化到图片加载后:在读取图片并转换为数组时,先把数组类型转为float32,再乘以1./255,这样就完成了像素值从0-255到0-1的缩放。
  3. 类型安全处理:显式指定dtype=np.float32可以避免整数除法的问题(如果图片是uint8类型,直接除以255会得到整数0)。

如果你用的是cv2.imread而不是PIL,代码逻辑类似,只需要调整图片读取的部分:

import cv2

# 列表推导式替换为:
np.array(cv2.resize(cv2.imread(file_name), (64, 128)), dtype=np.float32) * 1./255

这样修改后,你的DataGenerator就能正确生成归一化后的图片数组,不会再触发类型错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:22:36