环境要求

  1. 支持TensorFlow1.X,在TensorFlow1.X最后一个版本1.15.3上测试通过;TensorFlow2.0暂未测试

    总体使用流程

  2. 通过本工具得到分解训练之后的float pb模型,以及MNN模型压缩参数文件

  3. 通过MNN转换工具,输入这两个文件,得到最终的压缩模型

    支持的op,使用建议

  4. 支持 Conv2D, MatMul两种op

  5. 建议从已经训练好的float模型开始finetune
  6. 优化器超参使用模型收敛阶段的超参

    使用方法

    ```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()

  1. <a name="lAdTz"></a>
  2. # 相关API
  3. <a name="F00O8"></a>
  4. ## get_op_weight_values
  5. ```python
  6. get_op_weight_values(sess, npy_file_name)

参数: sess: 临时tf.Session,获取到权值numpy数值之后会被关掉 npy_file_name: str, 模型中权值的数值会被保存到此npy文件中,用于low_rank_decompose分解

返回值: 无

  1. ```
  2. <a name="GeKMf"></a>
  3. ## low_rank_decompose
  4. ```python
  5. low_rank_decompose(graph, weight_npy_file, compress_params_file, skip_layers=[""], align_channels=8,
  6. tucker_minimal_ratio=0.25,
  7. 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已经被分解