CeNiN
c e n i n (土耳其语中的“胎儿”是最小的,是纯C#中深c倒转n eural n etworks的馈送阶段的最低实现。它不需要任何第三方库,可以在.NET支持的所有编程语言中使用。
如果您在工作中使用它,则可以引用下面的论文:
Atasoy,H。&Kutlu,Y。(2025)。 CNNFET:卷积神经网络功能提取工具。 SoftwareX,30,102088。https://doi.org/10.1016/j.softx.2025.102088
有两个示例说明了如何在C#和VB.NET中使用CeNiN 。您可以在这里找到另一个( Imagetagger )。
您还可以查看CNNFET-卷积神经网络功能提取工具,该应用程序是利用CeNiN使用CNN从图像中提取功能的应用程序。
预验证的模型
您可以下载两种验证的CeNiN型号。这些实际上是牛津视觉几何组的两个VGG模型。这些模型的参数存储在“ CeNiN ”文件中,这些文件允许在.NET框架下快速将数百万参数加载到内存中。
- Imagenet-MatConvnet-VGG-F。 CeNiN (19层,60824256重量,232MB)
- Imagenet-vgg-very-deep-16。 CeNiN (37层,138344128重量,528MB)
表现
最耗时的层是卷积层。其他层足够快,没有额外的优化。
以下是从ImageNet-MatConvnet-VGG-F中传递图像的时间。 CeNiN上的Intel Core i7-6500U 2.50GHz CPU和8GB RAM:
conv_1 : 7548 ms-第一个也是最简单的实现
Conv_2 : 6763 MS-我使用了Nvidia论文中解释的方法(不,不使用GPU:D)。由于我在张量类中使用的索引方法,它的速度并不比第一个快得多。
conv_3 : 1975 ms-与conv_2相同,但是这次在索引时使用非重复乘法。
CONS : 1031 MS-此和Conv_3之间的唯一区别是并行化。这仅比多核CPU上的conv_3快。更快的广义矩阵乘法方法可以使其更快…
conv (usecblas = true): 151毫秒 – 带有blas支持
英特尔MKL支持(26/05/2019)
从0.2版开始, CeNiN支持使用Intel MKL库来加快矩阵乘法,如果以下文件与CeNiN .dll相同的文件夹中可用:
- mkl_rt.dll
- mkl_intel_thread.dll
- mkl_core.dll
- libiomp5md.dll
- mkl_def.dll
- mkl_avx.dll
- mkl_avx2.dll
- mkl_avx512.dll
- mkl_mc.dll
- mkl_mc3.dll
这些文件可以在“?:\\ program文件(x86)\\ intelswtools \\ compilers_and_libraries_2019.3.203 \\ Windows \\ redist \\ redist \\ intel64_win \\ mkl”中,从此链接中安装了Intel®MathKernel库后。
OpenBlas支持(12/05/2020)
从0.3版开始, CeNiN支持使用OpenBlas库来加快矩阵乘法,如果以下文件与CeNiN .Dll相同的文件夹中可用:
- OpenBlas.dll
- libquadmath-0.dll
- libgfortran-3.dll
- libgcc_s_seh-1.dll
预编译的OpenBlas库及其依赖项可以在此处找到。将DLL提取到与CeNiN .dll相同的文件夹中使用它们。
训练自己的模型
由于尚未实现反向传播,因此您无法使用此库训练模型。但是,如果您有训练有素的模型或想用另一个工具(例如Matconvnet)训练模型,则可以轻松地将训练有素的模型转换为CeNiN文件。 CeNiN文件结构如下所示。但是有一些局限性,因为该实施尽可能最小。 (实施层:卷积,池(仅最大池),relu,softmax)
实施新层类型
您可以实现新图层类型继承图层类。在所有层类型中,层的结构很简单,并且相同。新类型需要以下三个实现:
- 一个构造函数,该构造函数(如果需要)(如果需要)填充和/或步幅参数)
- 如果输入和输出张量的尺寸不同,则实现setOutputDims()函数。如果它们相同,则此功能在图层类中具有默认的插入。
- 实现FeedNext()函数。此函数应以呼叫访问tensormeMalloc()的呼叫开始,并以呼叫disposeInputTensor()结尾。
请注意,任何一层都没有输出张量定义。每一层的输入用作上一层的输出。
还请注意,需要填充的张量在填充之前会填充它们,以防止克隆记忆区域引起的性能降低。因此,应首选WriteNextLayerInput()写当前层的输出,尤其是在下一层的左或顶填充值不为零的情况下。这是唯一在将数据写入下一层的输入张量时负责填充的唯一功能…
此外,您可以找到一些在实现新层类型时可能有用的功能和操作器定义,在Tensor.cs中:
- 张量重塑,
- 张量 *张量(仅适用于等级-2张量;广义矩阵乘法),,
- 张量 *浮动,
- 张量 +张量,张量 – 张量,
- 张量 +浮子,张量 – 浮子
- 广播的添加(仅适用于等级-1张量)
。 CeNiN文件格式
此文件格式是结构化的,因此可以在.NET Framework下使用BinaryReader类的读取。该结构如下(新行是用于表示形式, CeNiN文件中没有新行。[]和{}也用于表示数据和类型):
CeNiN NEURAL NETWORK FILE {string without an ending null char}
[LayerCount] {1 x int32}
[InputSize] {3 x int32}
[AveragePixel] {3 x float}
For each layer in network:
[LayerTypeStringLength] {1 x byte (7-bit encoded int)}
[LayerType] {string}
[LayerParams] {different numbers of parameters in different orders, please see CNN() constructor in CNN.cs}
EOF {string without an ending null char}\”>
CeNiN NEURAL NETWORK FILE {string without an ending null char}
[LayerCount] {1 x int32}
[InputSize] {3 x int32}
[AveragePixel] {3 x float}
For each layer in network:
[LayerTypeStringLength] {1 x byte (7-bit encoded int)}
[LayerType] {string}
[LayerParams] {different numbers of parameters in different orders, please see CNN() constructor in CNN.cs}
EOF {string without an ending null char}
VGG2 CeNiN
在/src/Converter(14/05/2019)下,添加了将VGG格式转换为CeNiN格式的MATLAB函数(VGG2 CeNiN )。
链接
- 提出更快卷积方法的论文( Conv_2 , Conv_3和Conv中):
https://**ar*xiv.org/abs/1410.0759 - 预审计的模型(用于矩形):
http://www.vl*fe**at.org/matconvnet/pretrataining/ - 视觉几何组(VGG)
http://www.robots.**o*x.ac.uk/~vgg/ - 我在Inputlayer中使用的方法快速读取位图[在土耳其语]:
http://www.a*tas*oy*web.net/bitmapleri-net-catisi-altinda-hizlica-isleme - 我有关此图书馆的博客文章[土耳其语]:
http://www.a*tas*oy*web.net/cenin-konvolusyonel-yapay-sinir-agi-kutuphanesi - 我关于Blas [土耳其语]的博客文章:
http://www.ataso*yw*e*b.net/matlab-in-sihirli-degnegi-blas
