TypeError: Object dtype dtype('O') has no native HDF5 equivalent

参考资料

  1. Python TypeError: No conversion path for dtype: dtype(‘
  2. TypeError: Object dtype dtype(‘O’) has no native HDF5 equivalent
  3. python - 使用不同大小的h5py数组进行保存

错误描述

在对h5文件写的过程中,首先遇到了错误OSError: Cannot write data (no appropriate function for conversion path),网上搜索之后,与之相关的问题很少,大部分提到的是字符串编码问题,参照资料1,对字符串的编码修改,但错误依旧。在这个地方卡了很长时间,一直检查数据类型哪里是不是有问题?最后尝试性,将最后创建数据集中的dtype去掉,即置为None。即将

1
datafile.create_dataset("PrivateTest_gt", dtype = 'uint8', data=PrivateTest_z)

改为

1
datafile.create_dataset("PrivateTest_gt", data=PrivateTest_z)

问题出现了转机,提示的错误不一样了,TypeError: Object dtype dtype('O') has no native HDF5 equivalent,再查询这个问题上,发现很多博客,如资料2资料3提到出现错误的原因是:

要存储的数据中存在维度不一致的数据

具体datafile.create_dataset("PrivateTest_gt", data=PrivateTest_z)一行中,PrivateTest_z列表中存储着两种shape的图片数据,一种是48 * 48,而另一种是128 * 128。这种情况h5py无法统一处理。

解决方法

参照资料,解决这个问题常见有两种。

  • 散装

将相同维度的数据放在同一个dataset中,即把原始数据拆分成多个dataset存储

  • 统装

统一数据的维度。我用的就是这种方法,我将所有图片的数据都统一成128 * 128(对于48的resize),即解决上述问题。