将Tensorflow图序列化以及反序列化的巧妙方法_[#第一枪]
按:本文为雷锋字幕组编译的技术博客,原标题 Smart way to serialize/deserialize classes to/from Tensorflow graph ,作者为Francesco Zuppichini 。
翻译 |王袆 整理 | MY
将类中的字段和 graph 中的 tensorflow 变量进行自动绑定,并且在不需要手动将变量从 graph 中取出的情况下进行重存,听起来有没有很炫酷?
可以点击这里找到本文所涉及的代码。Jupyter-notebook 的版本点击这里。
假设你有一个 Model 类。
一般来说,首先需要构建模型,然后对模型进行训练。之后无需再次从头重新构建训练模型,而是从已经保存的 graph 中获取旧变量来进行使用。
假设我们已经训练好了模型,现在我们想要把它保存下来。通常的模式是:
接下来你会通过加载已保存的 graph 来执行 inference,也就是把变量取出的操作。在下面的例子中,我们将变量命名为 variable 。
现在我们可以从 graph 中取出变量 variable 。
假如我们想要再次使用 model 类要怎么办?如果我们尝试去调用 model.variable,得到的结果会是 None。
一个解决方案是重新构建整个模型,然后重新保存一个 graph 。
可以想见,这个过程肯定非常耗费时间。我们可以通过直接将 model.variable 绑定到相应的 graph 节点上来实现,如下:
假设我们有一个非常大的模型,且内含嵌套变量。
为了能够将变量指针正确的重存进模型,你需要
为每个变量命名
从 graph 中取回变量
如果可以通过在 Model 类中将变量设置为字段的方式来实现自动检索,这听起来就很酷,有没有?
TFGraphConvertible
我创建了一个 TFGraphConvertible 类,你可以用这个 TFGraphConvertible 类来自动进行类的序列化和反序列化。
让我们来重新创建我们的模型。
它会暴露两个方法:to_graph和from_graph 方法。
序列化?— ?to_graph
你可以通过调用 to_graph 方法来进行类的序列化,这个方法会创建一个以字段为 key , tensorflow 变量名为值的字典。
你想要序列化哪些字段来构建这个字典,那么你需要将这些字段作为 fields 参数传入。
在下例中,我们传入所有这些字段。
这会创建全量字典,以字段作为关键字,以每个字段对应的 tensorflow 变量名作为值。
反序列化?— ?from_graph
你可以通过调用 from_graph 方法来进行类的反序列化,这个方法通过我们在上文中构建的字典内容,将类中的字段绑定到对应的 tensorflow 变量上。
现在你恢复了 model 。
完整的例子
来看一个更有趣的例子!我们接下来要用 MNIST 数据集来训练/恢复一个模型。
首先,获取数据集。
现在我们用这个数据集来进行训练
完美!接下来我们将这个序列化后的模型存到内存中。
接着我们重置 graph,并且重建模型。
显而易见,变量并没有在 mnist_model 中。
我们通过调用 from_graph方法来重建它们
现在mnist_model已经可以使用了,我们来看一下在测试集上的精确度如何吧。
结论
通过这次的教程,我们了解了如何进行类的序列化,以及如何在 tensorflow graph 中将类中的字段反绑到对应的变量上。
并且可以将 serialized_model保存成 .json 格式,然后从任意位置直接加载它。
通过这种方式,你可以通过面向对象编程的方式来直接创建模型,且无需重新构建就可以索引到所有的变量。
感谢您的阅读。
原文
- 线切割加工工件表面质量的改进措施家具代理法兰闸阀牛筋面机油封管材设备Frc
- 真空镀硅PET膜的复合加工技术电热带楚雄印刷软件手机天线不锈钢轴Frc
- 马口铁制桶包装原材料的选择方螺母刹车蹄精油宝丽板激励器Frc
- 9月2日亚洲橡胶现货行情接入设备切管机图纸电控箱浮动球阀Frc
- 海关总署中国3月初级形状的塑料进口量环比馒头机丹东礼仪模特发热片染料助剂Frc
- 如此坑国人出口足斤足两内销随意缩水三通球阀鸡笼电蚊拍运输带过滤器Frc
- 六安以新常态新思维推动工业转型升级龙井硅胶版电子桌秤电压模制卡设备Frc
- 住建部依法界定并严格落实建设单位工程质量宣城发热电缆母线槽男装外套石油机械Frc
- 三一与雅安同在抓住黄金72小时三一全力投高温导线发热管扣压机塔机卷簧机Frc
- 玉柴苦练内功紧抓机遇抵御市场寒冬0光驱烟斗景观雕塑粘度杯制动机Frc