我想在 Raspberry Pi 3 上实现一个神经网络(权重在 -127 和 127 之间),我遇到了这个问题,我发现最快的方法是实现为嵌套 if 语句的二进制搜索;显然,if 语句需要自动生成,Python 来救援。
代码
给定一个 C 函数:
static
uint16_t sigmoid_lookup(int32_t i) {
#include "autogen_sigmoid_index.i"
}
和(sigmoid_value, at_argument) 的排序 Python 列表,此函数创建 if-else 树:
def produce_c_code(numbers_list, idxs, idxe, level):
if idxs >= idxe:
raise RuntimeError("idxs=%d idxe=%d")
indent= " "*level
if idxs + 1 == idxe: # end of recursion
yield indent + "return %d;" % numbers_list[idxs][0]
else:
idxm= (idxe+idxs)//2
yield indent + "if(i>=%d)" % numbers_list[idxm][1]
yield from produce_c_code(numbers_list, idxm, idxe, level+1)
yield indent + "else"
yield from produce_c_code(numbers_list, idxs, idxm, level+1)
示例
对于这个号码列表:[(0, 0), (1, 9), (2, 25), (3, 41), (4, 57), (5, 73), (6, 89)],产生的代码是:
if(i>=41)
if(i>=73)
if(i>=89)
return 6;
else
return 5;
else
if(i>=57)
return 4;
else
return 3;
else
if(i>=9)
if(i>=25)
return 2;
else
return 1;
else
return 0;
基准
基准测试基于我的案例的127 * n / sqrt(n*n + 4194304) sigmoid 函数,它们超出了输入范围 [-8000000, 8000000]。
奔腾 M 1.2 GHz
测试查找
CPU时间:300000
测试数学
CPU时间:1460000
树莓派 2 800 MHz
测试查找
CPU时间:474094
测试数学
CPU时间:2897385
树莓派 3 1.2GHz
测试查找
CPU时间:369665
测试数学
CPU时间:1570066
英特尔酷睿™2 Q6600 2.4 GHz
测试查找
CPU时间:73623
测试数学
CPU时间:797847