config.json 配置规范
config.json
用于保存 coefficient.npy
文件中浮点数的量化配置。
配置
config.json
中的每一项代表一层的配置。以下列代码为例:
{
"l1": {"/* the configuration of layer l1 */"},
"l2": {"/* the configuration of layer l2 */"},
"l3": {"/* the configuration of layer l3 */"},
...
}
每项的键 (key) 是 层名 。转换工具 convert.py
根据层名搜索相应的 .npy
文件。比如,层名为 “l1”,转换工具则会在 “l1_filter.npy” 文件中搜索 l1 的过滤器系数。config.json 中的层名需和 .npy 文件名中的层名保持一致。
每项的值是 层的配置。请填写表 1 中列出的层配置实参:
键 |
类型 |
值 |
---|---|---|
“operation” |
string |
|
“feature_type” |
string |
|
“filter_exponent” |
integer |
|
“bias” |
string |
|
“output_exponent” |
integer |
输出和偏差根据公式量化:value_float = value_int * 2^指数。
目前,”output_exponent” 仅在转换偏差系数时有效。当使用按层量化时, 必须提供”output_exponent”。如果特定层没有偏差或使用按通道量化时,”output_exponent” 可空置。
|
“input_exponent” |
integer |
当使用按通道量化时, 偏差的指数位与输入和过滤器的指数位相关。
如果有偏差时必须提供 “input_exponent” 用于转换偏差系数。如果特定层没有偏差或使用按层量化时,”input_exponent” 可空置。
|
“activation” |
dict |
|
键 |
类型 |
值 |
---|---|---|
“type” |
string |
|
“exponent” |
integer |
|
示例
假设有一个一层模型:
1. 使用 int16 按层量化:
层名:“mylayer”
operation:Conv2D(input, filter) + bias
output_exponent:-10
feature_type:s16,即 16 位整数量化
激活函数类型:PReLU
config.json 应写作:
{
"mylayer": {
"operation": "conv2d",
"feature_type": "s16",
"bias": "True",
"output_exponent": -10,
"activation": {
"type": "PReLU"
}
}
}
“filter_exponent” 和 “activation” 的 “exponent” 空置。 必须提供 “output_exponent” 用于转化该层的 bias
2. 使用 int8 按层量化:
层名:“mylayer”
operation:Conv2D(input, filter) + bias
output_exponent:-7, 该卷积层结果的指数位
feature_type:s8
激活函数类型:PReLU
config.json 应写作:
{
"mylayer": {
"operation": "conv2d",
"feature_type": "s8",
"bias": "True",
"output_exponent": -7,
"activation": {
"type": "PReLU"
}
}
}
必须提供 “output_exponent” 用于转化该层的 bias
3. 使用 int8 按通道量化:
层名:“mylayer”
operation:Conv2D(input, filter) + bias
input_exponent:-7, 该卷积层输入的指数位
feature_type:s8
激活函数类型:PReLU
config.json 应写作:
{
"mylayer": {
"operation": "conv2d",
"feature_type": "s8",
"bias": "True",
"input_exponent": -7,
"activation": {
"type": "PReLU"
}
}
}
必须提供 “input_exponent” 用于转化该层的 bias
同时,mylayer_filter.npy
、mylayer_bias.npy
和 mylayer_activation.npy
需要准备好。