微控制器上的卷积神经网络

数据挖掘 Python 美国有线电视新闻网 matlab
2022-02-14 11:20:19

我想知道是否可以像感知器一样将已经训练好的卷积神经网络表示为公式(x1w1+x2w2+=预言)。我知道这个公式可能会像这样复杂得多,但一般来说,是否有可能在 Python 或 Matlab 中训练一个 CNN,获得权重并创建一个算术、指数,无论用这些获得的权重制作什么公式?

我想这样做是因为我正在尝试在 PIC32 中进行分类,我认为它本身没有能力执行 CNN。

或者你知道是否有可以做 CNN 的“c 库”吗?

2个回答

从头开始实施任何这些都不适合胆小的人......

好吧,我对 PIC32 不熟悉,但您可以将 CNN 视为...

如何实施:

简化的CNN流程图,点击在美人鱼中查看

其中I*CKN detones卷积核 1和输入I的卷积

ICKN
可以实现为 where表示可以通过 FFT2 函数快速计算的 2D 傅里叶变换,FFT2 只是 2 轴上的 FFT,并且变换是可分离的,因此您可以使用 FFT 实现它,PIC32 具有 FFT 实现,例如this forum这对于 BIG KERNELS 来说非常快,对于较小的内核,您应该使用 2D 卷积。这很简单: 是你的图像, g你的卷积核。
F{I}×F{CKN}
F{.}二维卷积fg

卷积可以看起来像 其中是 I 块的扁平版本,以为中心,并且是翻转卷积核。,其中远小于图像的大小,则此实现比 FFT 更快。

ICKN=<B[x,y],H>dot
B[x,y](x,y)H(xi,yi)i[1,2,...,N]N

如果您的图像真的很小,您可以尝试这样做,我认为在 PIC32 中没有实现此功能,或者即使处理器足够快(它实现了 80MHz 的 MIPS 指令集,对吗?)这是实时的。

注意:一个简单的 NN计算复杂度对于一个 PIC32 来说已经是巨大的了。

关于信号处理的心态

由于您使用微控制器,因此我假设您对数字信号处理有所了解...

好吧,您可以将卷积内核视为二维 FIR 滤波器,这可能在市场上任何重要的微控制器上都有实现。

关于浮点数和整数的注意事项:

在这种处理器上浮点处理真的很慢(实际上是任何处理器),你可以利用整数来处理你的 CNN 和图像。这可以在不损失太多准确性的情况下完成,并且 TensorFlow 为其模型提供了许多量化算法。

我使用了 Caffe 的 YOLO 人脸检测器的量化版本,对准确性没有太大影响。

我觉得换一种方式比较容易...

对于这种缺乏处理能力的相对便宜的解决方案(而且也更容易实现)将是使用另一个处理单元,例如英特尔 Movidius或他们的神经计算棒(版本 2 具有 100 GFLOPS 的性能)。英特尔 NCS 可以使用 OpenVINO 进行编程,并支持 TensorFlow 和 Caffe NN。

(C)NN 的 C++ 实现

此外,您可以使用在 Python、Java 和 C 中实现的OpenCV DNN从 Caffe、Darknet、Tensorflow 和 Torch 加载和运行 CNN。然后你可以尝试使用他们的实现作为基础,源代码可以在这里找到。

您正在寻找的通常称为推理引擎。用于微控制器的 Tensorflow Lite刚刚发布。我还没有看到有人在 PIC32 上使用它,但应该可以将它移植到那个平台上。

对于 ARM Cortex-M 微控制器,还有更多选项,例如 uTensor 和 CMSIS-NN。后者是仅使用整数数学的低级实现,如果您的微控制器没有对浮点的硬件支持,这可能是一个很好的启发。