模型压缩实验设计

1.简介

1.1目的

   本文档主要对基于caffe框架的深度学习模型压缩方法的实验设计中各部分的工作进行介绍。

1.2范围

   文档的整体压缩框架的功能介绍,内容包括对caffe源码的修改以及相应模型压缩策略的实验设计。

2.设计目标

对基于caffe框架的深度学习模型压缩方法,设计一套集预训练,重训练,及测试于一体的模型压缩框架,并进行各种模型压缩策略的实验。

3.整体模型压缩框架介绍

本文设计的模型压缩框架支持预训练,重训练以及测试验证三个过程:

  • 预训练:和正常的caffe框架中模型的方法相同,可以对模型进行正常的训练,只是在对模型序列化的时候有点不同,因为模型压缩中最重要的方法是权值剪枝,这样会使得模型中本来的dense矩阵变成sparse矩阵,所以需要在序列化存储的时候将剪枝的权值矩阵以稀疏矩阵的形式存储。
  • 重训练:直接对剪枝后的模型进行测试验证,会发现模型的精度会有所下降,为了在一定程度上弥补这些下降的精度,就需要对剪枝后的模型进行retrain,本文设计的模型压缩模型可以直接读入预训练中序列化存储的模型文件,并对这个模型进行再训练,然后将训练好的模型序列化存储。
  • 测试验证:可以读入重训练后序列化的模型,并对这个模型进行测试验证。

上述的三个过程,可以仿照caffe中gflags库的用法在具体的caffe代码中通过添加FLAGS_step变量来控制不同阶段,FLAGS_step == “one”表示预训练阶段,FLAGS_step == “two”表示重训练阶段,FLAGS_step == “three”,表示测试验证阶段。

4. caffe中源码关键部分修改简介

4.1 预训练阶段

   为了支持稀疏矩阵序列化存储,需要在caffe.proto文件中的message BlobProto中添加如下内容:

message BlobProto {

  …

  optional bool sparse = 10 [default = false];//表示当前blob是否是稀疏矩阵

  optional bool trans = 11 [default = true];//表示当前矩稀疏矩阵是否需要转置

  optional int32 nnz = 12 [default = 0];//表示当前稀疏矩阵非零元素的个数

  repeated int csrrowptr = 13 [packed = true];//表示当前稀疏矩阵外部索引

repeated int csrcolind = 14 [packed = true];//表示当前稀疏矩阵内部索引

repeated float csrval = 15 [packed = true];// 表示当前稀疏矩阵非零值,如果是float型的话

repeated double double_csrval = 16 [packed = true]; // 表示当前稀疏矩阵非零值,如果是double型的话

  optional int32 outidxsize = 17 [default = 0]; //表示csrrowptr数组的长度

  …

}

同时在caffe中的blob类中添加和上述类似的变量,另外还要添加一个mask变量用来记录权值矩阵中被剪掉记录为0,没减掉记录为1。并在innerProduct层和conv层中添加剪枝算法函数compute_mask()这个函数会对权值矩阵进行剪枝,并且会对剪枝后的矩阵进行稀疏矩阵存储(利用Eigen稀疏矩阵运算方法),并在Net::ToProto()函数中逐层调用这个剪枝函数,并修改Blob::ToProto()函数这部分代码,最终将稀疏矩阵序列化存储。整个剪枝过程只会在预训练中进行,别的阶段不参与剪枝。

4.2 重训练阶段

   在重训练阶段中首先需要对预训练阶段的模型进行读入,这部分功能可以通过修改Blob::FromProto()函数进行修改,使得caffe支持对稀疏矩阵三个数组的读入。为了实现稀疏矩阵乘法的前向后向传播算法,在caffe中innerProduct和conv层的前向和后向的cpu代码中添加基于Eigen的稀疏矩阵和稠密矩阵相乘的运算函数caffe_cpu_dmsm(),在相应的前向和后向的gpu代码中添加了基于cusparse的稀疏矩阵和稠密矩阵相乘的运算函数caffe_gpu_dmsm()。为了使得梯度的更新对被剪枝的权值无效,修改Blob::Update()函数,屏蔽掉对被剪枝权值的梯度更新。这里要对cpu和gpu两部分代码同时进行修改。

4.3 测试验证阶段

   测试网络和训练网络对于weight读入的方法是一样的,所以这里不需要进行额外的修改,直接设置FLAGS_step == ”three“,就可以了。

5.模型压缩实验设计

5.1同时剪枝,参数全保留finetune

   这种方法是将预训练阶段得到的所有权值参数全部保留作为重训练阶段参数的初始化值,然后对重训练阶段的模型进行finetune。

5.2同时剪枝,参数全抛弃retrain

   这种方法是将预训练阶段得到的所有权值参数全部抛弃,在重训练阶段对这些参数进行重新初始化,然后retrain。

5.3 分段剪枝

只对innerProduct层剪枝,然后retrain,然后只对conv层剪枝,然后retrain。

以后在剪枝算法的基础上,会尝试权值共享,以及其他模型压缩的算法,并进行验证。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值