CeNiN

VB.NET 2025-08-05

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_2Conv_3Conv中):
    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
下载源码

通过命令行克隆项目:

git clone https://github.com/atasoyhus/CeNiN.git