环境要求
支持TensorFlow1.X,在TensorFlow1.X最后一个版本1.15.3上测试通过;TensorFlow2.0暂未测试
总体使用流程
通过本工具得到分解训练之后的float pb模型,以及MNN模型压缩参数文件
-
支持的op,使用建议
支持 Conv2D, MatMul两种op
- 建议从已经训练好的float模型开始finetune
- 优化器超参使用模型收敛阶段的超参
使用方法
```python from mnncompress.tensorflow import get_op_weight_values, low_rank_decompose
first, 构建前向网络模型
build_model()
新建一个临时session,此session会在分解之后关闭掉
temp_sess = tf.Session()
给原模型中的变量用checkpoint赋值
saver = tf.train.Saver() saver.restore(sess, ‘save/model.ckpt’)
获得图中的权值numpy数值
get_op_weight_values(temp_sess, “model_weights.npy”) temp_sess.close()
将模型图进行分解
low_rank_decompose(tf.get_default_graph(), “model_weights.npy”, “compress_params.bin”)
此时图已经分解,构建optimizer,正常训练即可
optimizer = …
恢复模型中未分解层的参数
saver = tf.train.Saver() saver.restore(sess, ‘save/model.ckpt’)
初始化分解之后的层的参数
initializers = tf.global_variables_initializer()
<a name="lAdTz"></a>
# 相关API
<a name="F00O8"></a>
## get_op_weight_values
```python
get_op_weight_values(sess, npy_file_name)
参数: sess: 临时tf.Session,获取到权值numpy数值之后会被关掉 npy_file_name: str, 模型中权值的数值会被保存到此npy文件中,用于low_rank_decompose分解
返回值: 无
```
<a name="GeKMf"></a>
## low_rank_decompose
```python
low_rank_decompose(graph, weight_npy_file, compress_params_file, skip_layers=[""], align_channels=8,
tucker_minimal_ratio=0.25,
reserved_singular_value_ratio=0.5, append=False)
参数: graph: 模型前向图 weight_npy_file: str, get_op_weight_values函数得到的模型权值npy文件名 compress_params_file: str, MNN模型压缩参数文件名 skip_layers: List[str], 跳过不分解层的名字,需要是nn.Conv2d或者nn.Linear类型,如[“features.conv1”,] align_channels: int, 分解之后进行通道对齐的通道数 tucker_minimal_ratio: float 0~1, 卷积层tucker分解保留的最低通道数比例 reserved_singular_value_ratio: svd分解保留的特征值之和占总特征值之和的比例 append: bool, 是否将低秩分解算法的参数追加到compress_params_file中去,为False,则将覆盖compress_params_file
返回值:
无返回值,此时当前graph已经被分解