Skip to content

Commit

Permalink
Merge pull request #32 from tpoisonooo/patch-1
Browse files Browse the repository at this point in the history
Update onnx2bnn_CN.md
  • Loading branch information
daquexian committed Jun 4, 2019
2 parents f0494db + dbc2566 commit 62160c4
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 5 deletions.
6 changes: 3 additions & 3 deletions docs/design_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@
## 软件架构
在使用流程和软件结构方面,dabnn 和已开源的推理库(如 [ncnn](https://github.com/Tencent/ncnn)[Tengine](https://github.com/OAID/Tengine)[FeatherCNN](https://github.com/Tencent/FeatherCNN) 等)差距不大:

1. 模型训练可使用任意一种可以导出 ONNX 模型的框架,但需要注意的是,二值卷积是自定义操作,为了让模型中二值卷积可以被 dabnn 正确识别,请看 [onnx2bnn_CN.md](docs/onnx2bnn_CN.md)
1. 部署模型前需要把 onnx 格式转换成 dabnn 内部格式。在转换过程中,会把二值卷积的权重转换为 1-bit (而不是默认的 32-bit),大大减小模型文件的体积。流程和**注意事项**可参照 [onnx2bnn_CN.md](docs/onnx2bnn_CN.md)
3. 二值卷积实现请查阅 [bconv_CN.md](docs/bconv_CN.md)
1. 模型训练可使用任意一种可以导出 ONNX 模型的框架,但需要注意的是,二值卷积是自定义操作,为了让模型中二值卷积可以被 dabnn 正确识别,请看 [onnx2bnn_CN.md](onnx2bnn_CN.md)
1. 部署模型前需要把 onnx 格式转换成 dabnn 内部格式。在转换过程中,会把二值卷积的权重转换为 1-bit (而不是默认的 32-bit),大大减小模型文件的体积。流程和**注意事项**可参照 [onnx2bnn_CN.md](onnx2bnn_CN.md)
3. 二值卷积实现请查阅 [bconv_CN.md](bconv_CN.md)
4 changes: 2 additions & 2 deletions docs/onnx2bnn_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ ONNX (Open Neural Network Exchange) 是一个独立于训练框架的模型格

## 模型转换流程

1. 识别二值卷积,对二值卷积的 weight 进行 bit-packing。dabnn 开发者给 onnx 增加了多个 optimizer,用来识别二值卷积,具体实现可参考 https://github.com/daquexian/onnx/tree/optimizer_for_bnn/onnx/optimizer/passes 中的 dabnn_*.h。关于 bit-packing 可以参考 [这篇文档](docs/bconv_CN.md);
1. 识别二值卷积,对二值卷积的 weight 进行 bit-packing。dabnn 开发者给 onnx 增加了多个 optimizer,用来识别二值卷积,具体实现可参考 https://github.com/daquexian/onnx/tree/optimizer_for_bnn/onnx/optimizer/passes 中的 dabnn_*.h。关于 bit-packing 可以参考 [这篇文档](bconv_CN.md);

1. 修改紧跟着二值卷积的 BN 层的权重。因为 bit 只有 1 和 0 两个值,所以二值卷积中的 -1 被用 0 表示,bitcount 可以得到一个 N-bit 操作数中,值为 1 的 bit 的数量,这忽略了 -1 的存在。具体来说,设 a 为一个 N-bit 操作数,b 是 a 中值为 1 的 bit 数量,c 是 a 中值为 0 的 bit 数量(即 -1 的数量)

Expand All @@ -24,7 +24,7 @@ ONNX (Open Neural Network Exchange) 是一个独立于训练框架的模型格

1. **二值卷积的输入 channel 暂时需要是 128 的倍数或 64**

1. 二值卷积是自定义操作,因此可能存在多种实现,网上存在的二值卷积的自定义实现几乎全部是错的,例如它们用 0 进行 pad,而忽略了二值卷积的输入只能有 +1 和 -1。dabnn 开发者提供了一个[标准的二值卷积 PyTorch 实现](https://gist.github.com/daquexian/7db1e7f1e0a92ab13ac1ad028233a9eb),我们建议所有二值网络的训练者使用这个实现,或是按照这个实现来在他们用的训练框架中自行实现二值卷积;
1. 二值卷积是自定义操作,因此可能存在多种实现,网上存在的大部分二值卷积自定义实现是不完全正确的,例如它们用 0 进行 pad,而忽略了二值卷积的输入只能有 +1 和 -1。dabnn 开发者提供了一个[标准的二值卷积 PyTorch 实现](https://gist.github.com/daquexian/7db1e7f1e0a92ab13ac1ad028233a9eb),我们建议所有二值网络的训练者使用这个实现,或是按照这个实现来在他们用的训练框架中自行实现二值卷积;

1. onnx2bnn 有多种针对二值卷积的识别模式,例如会根据卷积的权重(是否为 +1/-1)识别、根据 Sign operator 识别,在用户选择 aggressive 模式时,甚至可以识别上一条所述的非正确的二值卷积(但在运算时仍会以 -1 而不是 0 来 pad,因此会导致结果不完全一致)。具体请看 [这篇文档](https://github.com/JDAI-CV/dabnn/wiki/Train,-export-and-convert-a-dabnn-model)

Expand Down

0 comments on commit 62160c4

Please sign in to comment.