如何在自定义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)
关键修改点说明
- 移除无效的路径数组运算:删掉了原来对
batch_x(路径数组)的*1/255操作,因为那是字符串数组,不支持数值运算。 - 移归一化到图片加载后:在读取图片并转换为数组时,先把数组类型转为
float32,再乘以1./255,这样就完成了像素值从0-255到0-1的缩放。 - 类型安全处理:显式指定
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
相关产品推荐
相关产品推荐

