Python无需解压直接读取zip内.h5模型权重文件报错如何解决
不解压zip包直接加载.h5模型权重的解决方法
报错原因
load_weights方法接收参数时,如果传入的是类文件对象,Keras底层会先尝试调用endswith方法判断文件后缀,而ZipExtFile对象本身没有这个方法,因此触发属性错误。之前读取json文件正常,是因为model_from_json直接接收字节内容,不需要判断文件后缀。
实现代码
核心思路是将zip压缩包中的h5文件读入内存,包装为h5py可识别的文件对象,全程不需要落地解压:
from zipfile import ZipFile import io import h5py from tensorflow.keras.models import model_from_json archive = ZipFile(request.data['modelfile']) for file in archive.infolist(): ext = file.filename.split('.')[-1] if ext == 'h5': # 读取zip内h5文件的字节内容,用BytesIO模拟本地文件 h5_content = io.BytesIO(archive.read(file)) # 用h5py加载内存中的h5文件 model_h5 = h5py.File(h5_content, 'r') elif ext == 'json': model_json_file = archive.open(file) # 加载模型结构 loaded_model = model_from_json(model_json_file.read()) # 加载权重,直接传入h5py文件对象即可 loaded_model.load_weights(model_h5) # 用完手动关闭文件对象,避免内存泄漏 model_h5.close() archive.close()
补充说明
如果模型权重文件过大,内存占用较高,也可以将zip包写入服务器临时内存文件系统(如Linux的tmpfs),操作完成后自动删除临时文件,同样不会永久留存解压后的文件,符合后端安全要求。
内容的提问来源于stack exchange,提问作者Hoo Louis
相关产品推荐
相关产品推荐

