超过70个DNN卷积算法的模板库
在机器学习中,卷积神经网络是一种深度前馈人工神经网络,已成功地应用于图像识别。
卷积神经网络是解决各种重要神经网络的机器算法之一。今天介绍的triNNity是在一个地方收集尽可能多的DNN卷积算法,并提供干净、简单和高性能的实现,它也是DNN卷积算法设计的试验平台。
该库实现了正常的密集卷积(包括直接和GEMM)、条纹卷积、扩张卷积、分组卷积、稀疏卷积、Winograd卷积、FFT卷积等,其中包括针对1x1卷积等情况的超高性能专用算法。
许多库和框架像im2col、fft和其他算法一样提供了单片操作,但实际上有几十种这些方法的算法变体,所有这些变体都更适合某种类型的卷积。
im2col
一个图像 input_num=1;
图像通道 input_channel=1;
图像高 input_h=4;
图像宽 input_w=4;
kernel高 kernel_h=3;
kernel宽 kernel_w=3;
stride=1;pad=0;
卷积后,输出图像的计算公式:
output_h=(input_h-kernel_h)/stride+1;
output_w=(input_w-kernel_w)/stride+1;
如下图,(注:图像中数据不代表图像的颜色数值)
原图(图a)按照从左到右、从上到下的过程,将(a)中大小为3*3(因为kernel大小为3*3)的矩阵拉成右图(图b)中的一列。具体过程如下图所示:
多通道的im2col
假设有三个通道(R、G、B)图像通道 input_channel=3;
图像在内存中的存储是:首先是连续存储第一通道的数据,然后再存储第二通道的数据,最后存储第三通道的数据。如下图:
多通道的im2col的过程,是首先im2col第一通道,然后在im2col第二通道,最后im2col第三通道。各通道im2col的数据在内存中也是连续存储的。如下图:
在底层,该库使用BLAS、OpenMP多线程、SIMD矢量化等等,而不需要任何程序员干预。它也可以完全独立运行,没有任何启用这些组件或仅启用这些组件的子集。我们目前支持x86_64和aarch64,但是计划支持更多的平台。由于该库是作为header -only c++发布的,因此启动一个新平台所需要的都是支持C ++ 14标准的工作编译器。
目前已经与英特尔MKL、OpenBLAS、ARM计算库、FFTW和libxsmm等集成在一起,作为提供特定功能(如优化的GEMM例程)的后端库。
该库是在BSD3许可证下发布的,并附有一个广泛的性能基准测试套件。
该基准测试套件包含基于PBQP公式的复杂的提前优化框架的原型实现,该框架使用来自性能基准测试的简档计时来构建成本模型,其可以从70多种卷积算法中静态地选择以产生一个完整的CNN的可证明的最佳实例。