tiny dnn

C/C++ 2025-08-04



由于维护者只是想继续前进,因此可以放弃该项目。在任何人对继续项目感兴趣的情况下,请告诉我们,以便我们可以讨论下一步。

请访问:https://groups.google.com/forum/#!forum/tiny-dnn-dev


Tiny-DNN是C ++ 14深度学习的实施。它适用于有限的计算资源,嵌入式系统和物联网设备的深入学习。

Linux/Mac OS 视窗

目录

  • 特征
  • 与其他图书馆进行比较
  • 支持的网络
  • 依赖性
  • 建造
  • 例子
  • 贡献
  • 参考
  • 执照
  • 吉特室

查看文档以获取更多信息。

什么是新的

  • 2016/11/30 V1.0.0A3已发布!
  • 2016/9/14 tiny-dnn v1.0.0.0alpha已发布!
  • 2016/8/7 Tiny-DNN现在已转移到组织帐户,并将其重命名为Tiny-DNN :)
  • 2016/7/27 Tiny-DNN V0.1.1发布!

特征

  • 相当快,没有GPU:
    • 带有TBB螺纹和SSE/AVX矢量化。
    • MNIST在13分钟训练中的精度为98.8%(@core I7-3520m)。
  • 便携式和标题:
    • 只要您拥有支持C ++ 14的编译器,就可以在任何地方运行。
    • 只需包含tiny_dnn.h,然后将您的模型写入C ++即可。没有什么可安装的。
  • 易于与真实应用程序集成:
    • 没有输出对Stdout/stderr的输出。
    • 恒定的吞吐量(简单的并行化模型,无垃圾收集)。
    • 没有抛出例外的情况下工作。
    • 可以导入Caffe的模型。
  • 简单实施:
    • 学习神经网络的好库。

与其他图书馆进行比较

请参阅Wiki页面。

支持的网络

图层类型

    • 完全连接
    • 辍学
    • 线性操作
    • 零填充
    • 力量
  • 卷积
    • 卷积
    • 平均合并
    • 最大池
    • 反向解决方案
    • 平均不熟食
    • 最大不冷
  • 正常化
    • 对比归一化(仅向前传)
    • 批量归一化
  • 拆分/合并
    • concat
    • elementwise-add

激活功能

  • Tanh
  • asinh
  • 乙状结肠
  • SoftMax
  • 软plus
  • SoftSign
  • 纠正线性(relu)
  • 漏水
  • 身份
  • 缩放的tanh
  • 指数线性单元(ELU)
  • 缩放指数线性单元(SELU)

损失功能

  • 跨肠道
  • 平方误差
  • 平均绝对错误
  • Epsilon范围的平均绝对误差

优化算法

  • 随机梯度下降(有/不具有L2归一化)
  • 动力和内斯特罗的动力
  • Adagrad
  • RMSPROP
  • 亚当
  • Adamax

依赖性

没有什么。您需要的只是C ++ 14编译器(GCC 4.9+,Clang 3.6+或VS 2015+)。

建造

Tiny-DNN仅是标题,所以没有什么可建造的。如果要执行示例程序或单元测试,则需要安装CMAKE并键入以下命令:

cmake . -DBUILD_EXAMPLES=ON
make

然后更改为示例目录并运行可执行文件。

如果您想使用诸如Visual Studio或Xcode之类的IDE,也可以使用CMAKE生成相应的文件:

cmake . -G "Xcode"            # for Xcode users
cmake . -G "NMake Makefiles"  # for Windows Visual Studio users

然后在Visual Studio中打开.sln文件并在Windows/MSVC上构建,或键入Make Command(在Linux/Mac/Windows-Mingw上)。

有一些CMAKE选项可用:

选项 描述 默认 使用的其他要求
USE_TBB 使用英特尔TBB并行化 1 英特尔TBB
USE_OMP 使用OpenMP进行并行化 1 OpenMP编译器
USE_SSE 使用Intel SSE指令集 支持SSE的英特尔CPU
USE_AVX 使用英特尔AVX指令集 支持AVX的英特尔CPU
USE_AVX2 使用AVX2库支持构建微小的DNN 离开 支持AVX2的英特尔CPU
USE_NNPACK 使用NNPACK进行卷积操作 离开 多核CPU上神经网络的加速软件包
USE_OPENCL 启用/禁用OpenCL支持(实验) 离开 异质系统并行编程的开放标准
use_libdnn 使用greentea libdnn通过OpenCL(实验)与GPU进行卷积操作 离开 支持CUDA和OPENCL的通用卷积实施
use_serializer 启用模型序列化 2 -
use_double 使用双精度计算而不是单个精度 离开 -
use_asan 使用地址消毒剂 离开 Clang或GCC编译器
use_image_api 启用图像API支持 -
use_gemmlowp 启用Gemmlowp支持 离开 -
build_tests 建立单元测试 休息3 -
build_examples 建立示例项目 离开 -
build_docs 构建文档 离开 doxygen
轮廓 建立单元测试 离开 Gprof

1 Tiny-DNN使用C ++ 14标准库进行并行化。

2如果您不使用序列化,则可以关闭加速汇编时间。

3 Tiny-DNN使用Google测试作为默认框架来运行单元测试。无需预安装,它会在CMAKE配置期间自动下载。

例如,如果要使用Intel TBB并构建测试,请键入以下命令:

cmake -DUSE_TBB=ON -DBUILD_TESTS=ON . 

自定义配置

您可以编辑包含/config.h以自定义默认行为。

例子

构建卷积神经网络

# include " tiny_dnn/tiny_dnn.h "
using namespace tiny_dnn ;
using namespace tiny_dnn ::activation ;
using namespace tiny_dnn ::layers ;

void construct_cnn () {
    using namespace tiny_dnn ;

    network net;

    // add layers
    net << conv ( 32 , 32 , 5 , 1 , 6 ) << tanh ()  // in:32x32x1, 5x5conv, 6fmaps
        << ave_pool ( 28 , 28 , 6 , 2 ) << tanh () // in:28x28x6, 2x2pooling
        << fc ( 14 * 14 * 6 , 120 ) << tanh ()   // in:14x14x6, out:120
        << fc ( 120 , 10 );                     // in:120,     out:10

    assert (net. in_data_size () == 32 * 32 );
    assert (net. out_data_size () == 10 );

    // load MNIST dataset
    std::vector< label_t > train_labels;
    std::vector< vec_t > train_images;

    parse_mnist_labels ( " train-labels.idx1-ubyte " , &train_labels);
    parse_mnist_images ( " train-images.idx3-ubyte " , &train_images, - 1.0 , 1.0 , 2 , 2 );

    // declare optimization algorithm
    adagrad optimizer;

    // train (50-epoch, 30-minibatch)
    net. train (optimizer, train_images, train_labels, 30 , 50 );

    // save
    net. save ( " net " );

    // load
    // network net2;
    // net2.load("net");
}

构建多层感知器(MLP)

# include " tiny_dnn/tiny_dnn.h "
using namespace tiny_dnn ;
using namespace tiny_dnn ::activation ;
using namespace tiny_dnn ::layers ;

void construct_mlp () {
    network net;

    net << fc ( 32 * 32 , 300 ) << sigmoid () << fc ( 300 , 10 );

    assert (net. in_data_size () == 32 * 32 );
    assert (net. out_data_size () == 10 );
}

构造MLP的另一种方法

# include " tiny_dnn/tiny_dnn.h "
using namespace tiny_dnn ;
using namespace tiny_dnn ::activation ;

void construct_mlp () {
    auto mynet = make_mlp({ 32 * 32 , 300 , 10 });

    assert (mynet. in_data_size () == 32 * 32 );
    assert (mynet. out_data_size () == 10 );
}

有关更多样本,请阅读示例/main.cpp或mnist示例页面。

贡献

由于深度学习社区正在迅速增长,因此我们很乐意从您那里获得贡献,以加速微小的DNN开发!有关贡献的快速指南,请查看贡献文件。

参考

[1] Y. Bengio,基于梯度的深度建筑培训的实用建议。 ARXIV:1206.5533V2,2012

[2] Y. Lecun,L。Bottou,Y。Bengio和P. Haffner,基于梯度的学习应用于文档识别。 IEEE的论文集,86,2278-2324。

其他有用的参考列表:

  • UFLDL建议阅读
  • 深度学习。net阅读列表

执照

BSD 3级许可证

吉特室

我们有用于讨论新功能和质量检查的吉特室。随时加入我们!

开发人员 https://gi*t*ter*.im/tiny-dnn/developers
用户 https://gitt*e*r.i*m/tiny-dnn/users
下载源码

通过命令行克隆项目:

git clone https://github.com/tiny-dnn/tiny-dnn.git