-
问题描述:现在想将tensorflow的权重转成fluid接口的权重,对应的tensor是否可以直接转换?在代码中,fliud如何给指定的tensor赋值?
-
问题分析:所谓的权重,其本质就是一个矩阵,该矩阵在训练神经网络时获得,在TensorFlow中通常会将训练完的节点权重矩阵以文件的信息保存,因为tensorflow保存模型的文件格式与PaddlePaddle的存在差异,所以目前是无法直接将tensorFlow保存的模型文件直接导入。但理论上依旧可以将TensorFLow文件中的权重矩阵转到Fluid对应的接口上,需要手动操作。
-
解决方法:
在Fluid中,可以手动的为tensor赋值,实例代码如下:
import paddle.fluid as fluid
import numpy as np
np_data = np.random.uniform(0.1, 1, [3, 512, 512])
a = fluid.global_scope().find_var('var_a').get_tensor()
a.set(np_data)
上述代码会获得网络结构中名为var_a的节点,然后手动为该接口对应的tensor赋值。
- 问题拓展:
不只是TensorFlow中模型的节点的权重转为PaddlePaddle中模型节点的参数,对于任意框架,只要提供了手动设置节点参数值的方法都可以实现使用不同框架实现的模型的参数权重的转移,一个常规的思路就是先使用该模块对应的原框架将模型权重矩阵文件读入并通过numpy写成常规的numpy文件,在使用另外一个框架,如PaddlePaddle框架,将numpy文件读入,再使用相应的赋值方法将神经网络结构中节点的参数手动赋值,达到模型参数在不同框架间的转移。