将 Keras 模型 HDF5 文件存储到 SQL 数据库
Posted
技术标签:
【中文标题】将 Keras 模型 HDF5 文件存储到 SQL 数据库【英文标题】:Storing Keras model HDF5 file to SQL database 【发布时间】:2019-10-03 20:55:10 【问题描述】:我有一个定期更新的 Keras 神经网络模型。对于历史可追溯性,我想在数据库中保留每个训练模型(架构 + 权重 + 优化器状态)的副本。 Keras will export an HDF5 file 包含有关模型的所有信息。有没有办法将此文件转换为可以存储在 SQL 数据库记录中的格式,以便以后可以检索/使用完整模型,即使检索速度不是很快?
我正在使用 Python3 来构建/训练模型并与 SQL 数据库进行交互。另外,如果这有所不同,我将使用 MS SQL Server 作为数据库。
更新:
基于 cmets,我正在保存 HDF5 文件,然后将该文件读回 Python,如下所示:
filepath = 'C:\\path\\to\\file.h5'
model.save(filepath)
with open(filepath, "rb") as f:
model_bytes = f.read()
当我尝试将 INSERT
model_bytes
值放入 MSSQL 中的 VARBINARY(MAX)
列时,我收到以下错误:
pypyodbc.DataError: ('22018', '[22018] [Microsoft][ODBC SQL Server 驱动程序][SQL Server]操作数类型冲突:ntext 不兼容 varbinary(max)')
关于如何在 Python 中预处理字节数据类型以使其在 SQL 中正确插入的任何想法?
当我将model_bytes
打印到屏幕上时,它看起来像这样:
b'\x89HDF\r\n\x1a\n\x00\x00\x00\x00\x00\x08\x08\x00\x04\x00\x10\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff@\x13\x01\x00\x00\x00\x00\x00\xff\xff\xff \xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\ x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00\x01\x00\x08\x00\x01\ x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\x10\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\ x00\x18\x01\x00\x00\x00\x00\x00\x00TREE\x00\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x18\x00\x00...
【问题讨论】:
您可以将文件存储在varbinary(max)
列中。您可能应该使用Filetable 来简化文件管理,尤其是对于大文件
在我调用 SQL INSERT 语句将文件上传到带有varbinary(max)
列的Filetable
之前,是否需要进行任何数据转换/准备?
【参考方案1】:
我无法找到一个干净的方法来做到这一点。我解决它的方法是将文件名/路径与一些关于模型的元数据一起存储在数据库中。我将实际模型(HDF5 文件)存储在 Google Cloud Storage 中。因此,当我想检索模型时,我会查询数据库以获取最新的文件名,然后从 Google Cloud Storage 下载它。
【讨论】:
以上是关于将 Keras 模型 HDF5 文件存储到 SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章
将 HDF5 文件中的大型数据集读入 x_train 并在 keras 模型中使用