StyleGAN2-ADA生成tfrecords随机报axes don't match array错误 删图无效怎么解决
生成Wikiart数据集TFRecords随机报错
axes don't match array修复方案 问题实际表现
- 运行环境:Google Colab,目标是训练1024×1024分辨率的GAN,数据集为从Wikiart爬取、统一预处理为1024×1024尺寸的图像集
- 触发环节:使用StyleGAN系列配套的
dataset_tool.py脚本生成TFRecords时,固定在行img = img.transpose([2, 0, 1]) # HWC => CHW抛出维度不匹配错误 - 异常特征:报错触发的文件完全随机——同一文件在某一次运行中可以正常处理,移除其他报错文件后,下一次运行反而会在该文件上触发错误,逐次手动删除报错文件的流程看不到明确终结点,同时担心筛完剩下的数据集样本量不足以支撑训练
Traceback (most recent call last): File "dataset_tool.py", line 1249, in <module> execute_cmdline(sys.argv) File "dataset_tool.py", line 1244, in execute_cmdline func(**vars(args)) File "dataset_tool.py", line 714, in create_from_images img = img.transpose([2, 0, 1]) # HWC => CHW ValueError: axes don't match array
核心根因
这个报错的本质非常直接:转置操作要求输入数组为3维结构(对应HWC格式的高、宽、通道三个维度),只要读入的图片数组维度不满足这个要求,就会直接抛错。之所以报错完全随机,主要是三个原因叠加:
- Wikiart爬取的源文件本身格式杂糅,混杂了灰度图、带透明通道的PNG、索引色图片、半损坏的截断文件,这些文件读入后生成的numpy数组天生不符合3维HWC的要求
- Google Colab挂载的Google Drive存在随机IO断流问题,1024×1024的大尺寸图片读取时偶发传输截断,本来完整的3维数组读到一半就断流,最后生成的数组维度少于3维——这种截断完全随机,和文件本身是否损坏无关,换个Colab运行节点、换一次运行时机,断流的位置就会变,这就是同一个文件有时能过、有时报错的核心原因
- 原脚本没有做任何维度兜底校验,碰到不符合要求的数组直接硬转置,没有修复、跳过的逻辑,才会一碰到维度不对就直接中断整个流程
可落地修复方案
- 修改
dataset_tool.py的图像读取逻辑,在硬转置前加全链路维度校验:- 读入图片后先判断数组维度:如果是2维的灰度图,直接在最后扩1维后复制3次通道,转成H×W×3的标准RGB格式
- 如果是4维的带alpha通道的PNG,直接截掉最后一维的透明通道,取前3个通道的RGB内容
- 如果数组维度不是2维也不是3维(比如IO截断生成的1维数组),直接跳过当前文件,打印日志记录路径,从根源上避免维度不匹配的报错
- 解决Colab随机IO截断问题:不要直接从挂载的Google Drive上读取原始图片生成TFRecords,先把所有原始图片整体拷贝到Colab本地的临时SSD存储(
/tmp目录),等所有文件拷贝完成、本地文件大小和源文件校验一致后,再在本地存储上跑生成流程,能消除90%以上因读取断流导致的随机报错 - 提前批量预筛无效文件:单独写个遍历脚本,用PIL的
Image.open()+img.verify()校验所有图片的可读性、尺寸合规性,把读不出来、尺寸不对的文件提前移到单独的异常文件夹,一次性筛完无效文件,流程就有明确的终结点,不用跑一半临时删文件 - 不用执着于凑全量数据集:Wikiart源数据集本身规模较大,就算筛掉15%左右的无效/损坏文件,只要最终剩余样本量达到StyleGAN训练的最低要求(单类别不低于5000张、多类别总样本不低于1万张),就完全不影响训练效果,没必要为了保留每一张图片反复跑随机报错的流程
内容的提问来源于stack exchange,提问作者richvar
相关产品推荐
相关产品推荐

