ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

在应用项目中集成 tiny-dnn:header-only 深度学习的头文件引入、编译配置与工程接入指南

在应用项目中集成 tiny-dnn:header-only 深度学习的头文件引入、编译配置与工程接入指南 人工智能深度学习嵌入式【免费下载链接】tiny-dnnheader only, dependency-free deep learning framework in C14项目地址https://gitcode.com/gh_mirrors/ti/tiny-dnn点击查看免费下载本文围绕 tiny-dnn 官方指南 Integrate with your application 展开系统讲解如何把这款header-only、无第三方依赖的 C14 深度学习框架集成进你自己的应用程序从一行#include到编译器标准模式设置再到构建系统的 include path 配置最后结合仓库源码深入说明其头文件聚合结构、可裁剪的编译宏与基于 CMake 的标准接入方式。读完本文你将能在自己的 C 项目中直接使用 tiny-dnn 构建、训练和部署神经网络而不需要安装任何动态库或执行任何库构建步骤。为什么 tiny-dnn 集成如此简单tiny-dnn 的定位是header-only纯头文件框架整个项目把全部实现放在tiny_dnn/目录下的头文件里不存在需要编译链接的.cpp库文件。仓库根目录 CMakeLists.txt 中的核心目标定义印证了这一点add_library(${project_library_target_name} INTERFACE)这里创建的tiny_dnn是一个INTERFACE 库——它本身不产生任何编译产物只是向使用者传递头文件目录与编译选项。因此在你的应用里集成 tiny-dnn 不需要make install、不需要动态库、不需要链接步骤唯一的构建发生在你自己的编译命令里。官方文档将其集成过程精炼为三步下文逐一展开并结合仓库源码补充每一步的细节与依据。Step 1/3在应用程序中包含 tiny_dnn.h集成第一步只需要在你的源码中加入一行#include tiny_dnn/tiny_dnn.h这行代码引入的是框架的统一入口头文件tiny_dnn/tiny_dnn.h。从该文件第 10~12 行的内容可以看到它首先聚合了框架最核心的三部分#include tiny_dnn/config.h // 全局配置精度类型、并行与向量化开关等 #include tiny_dnn/network.h // 网络模型sequential / graph #include tiny_dnn/nodes.h // 网络节点与算子随后它按类别聚合了全部可用功能模块包括但不限于激活函数relu_layer.h、sigmoid_layer.h、tanh_layer.h、softmax_layer.h、elu_layer.h、leaky_relu_layer.h、selu_layer.h、softplus_layer.h、softsign_layer.h、asinh_layer.h、tanh_p1m2_layer.htiny_dnn/activations网络层convolutional_layer.h、fully_connected_layer.h、max_pooling_layer.h、average_pooling_layer.h、deconvolutional_layer.h、batch_normalization_layer.h、dropout_layer.h、lstm_cell.h、rnn_cell.h、gru_cell.h、concat_layer.h、slice_layer.h、zero_pad_layer.h等tiny_dnn/layers损失函数与优化器loss_function.h、optimizer.h数据解析mnist_parser.h、cifar10_parser.h、caffe/layer_factory.h工具序列化辅助、权重初始化、梯度检查等为了让 API 更简洁tiny_dnn.h还在tiny_dnn::layers与tiny_dnn::activation命名空间中提供了大量短名别名例如layers::conv卷积层、layers::fc/layers::dense全连接层、layers::max_pool、layers::ave_pool、activation::relu、activation::tanh、activation::softmax等。因此在应用代码中通常配合using namespace使用#include tiny_dnn/tiny_dnn.h using namespace tiny_dnn; using namespace tiny_dnn::layers; using namespace tiny_dnn::activation;关于 include 路径的两种用法#include tiny_dnn/tiny_dnn.h中带tiny_dnn/前缀意味着你的编译器include path 必须指向仓库根目录稍后 Step 3 详述。如果你更习惯把整套头文件直接放进项目根目录也可以改为相对引用——仓库在 Integrate-with-your-application.md 中建议另一种做法是把 tiny-dnn 的头文件放到你自己的项目根目录下此时#include tiny_dnn/tiny_dnn.h依然可用前提是项目根目录内保留了tiny_dnn/这一子目录结构。入口头文件中的条件编译tiny_dnn.h并非无条件引入全部内容它受若干宏控制这一点对集成者理解为什么有些类型不可用很有帮助详见 Step 2 的配置小节定义了CNN_USE_GEMMLOWP时才引入quantized_fully_connected_layer.h量化全连接层定义了DNN_USE_IMAGE_API时才引入util/image.h图像 API默认通过 CMake 开启未定义CNN_NO_SERIALIZATION时才引入序列化辅助头文件并注册各激活层的 cereal 类型定义了CNN_USE_CAFFE_CONVERTER时才引入 Caffe 模型转换支持实验性依赖 Google protobuf。Step 2/3启用 C11/C14 编译模式tiny-dnn 使用 C11 的核心特性与标准库并在 CMake 中默认按 C14 构建参见 CMakeLists.txt 第 242~243 行set(CMAKE_CXX_STANDARD 14)。因此必须使用支持 C11 的编译器并以 C11 模式进行编译。官方文档按编译器类型给出了明确的操作方式。Visual Studio2013 及以上VS2013 起 C11 特性默认开启无需任何额外配置直接编译即可。gcc4.8 及以上与 clang3.3 及以上需要显式指定 C11 模式-stdc11文档同时给出了一条针对新版 gcc 的提示从 gcc 6.0 起C 的默认编译模式已是-stdgnu14因此可以省略该选项。如果你用更新的 clang 版本其默认模式通常也高于 C11是否显式加-stdc11取决于你希望锁定哪个语言标准为保持可移植性建议仍然显式声明。注意仓库 README 的依赖说明为 C14 compiler (gcc 4.9, clang 3.6 or VS 2015)与文档中gcc 4.8/clang 3.3的表述略有差异——前者是官方建议的较稳妥版本下限后者是支持 C11 模式的最低要求。集成时建议以 README 的 C14 编译器要求为准。可选自定义配置宏config.htiny_dnn/config.h 是框架的全局配置头文件集成者可以在自己的代码里通过宏裁剪框架行为例如CNN_USE_TBB/CNN_USE_OMP/CNN_USE_GCD切换多线程并行后端不定义时默认使用 C11 标准线程CNN_USE_SSE/CNN_USE_AVX启用 SIMD 向量化CNN_USE_EXCEPTIONS使用异常默认开启README 强调集成友好性实际也可关闭异常框架在不抛异常时仍可运行CNN_USE_STDOUT是否向标准输出打印信息默认开启注释掉可让框架保持静默CNN_SINGLE_THREAD强制单线程模式CNN_NO_SERIALIZATION关闭序列化支持以加快编译链接时间不使用时建议打开DNN_USE_IMAGE_API启用图像 APICNN_USE_DOUBLE把计算类型tiny_dnn::float_t从默认的float切换为double。这些宏与 CMake 选项一一对应你也可以全部交给 CMake 处理见 Step 3 的 CMake 小节不必手写宏。Step 3/3把 tiny-dnn 的 include path 加入构建系统最后一步是告诉你的构建系统 tiny-dnn 头文件在哪里。官方文档给出的 gcc 直接编译示例为g -stdc11 -Iyour-downloaded-path -O3 your-app.cpp -o your-app参数含义拆解参数作用-stdc11开启 C11 模式见 Step 2-Iyour-downloaded-path把下载的 tiny-dnn 仓库根目录加入头文件搜索路径使#include tiny_dnn/tiny_dnn.h可被解析-O3开启最高优化等级对深度学习算子的向量化与循环优化至关重要your-app.cpp -o your-app编译你的源文件并输出可执行程序假设你下载的仓库位于~/libs/tiny-dnn实际命令形如g -stdc14 -I~/libs/tiny-dnn -O3 your-app.cpp -o your-app文档还提供了一种更简单的替代方案直接把 tiny-dnn 的头文件目录放进你的项目根目录从而免去-I参数的维护。通过 CMake 集成推荐方式tiny-dnn 自带完整的 CMake 支持仓库根 CMakeLists.txt 不仅创建了 INTERFACE 目标还配置了安装规则与find_package配置文件tinydnn-config.cmake等见 cmake/Templates。在你自己项目的CMakeLists.txt中只需# 方式一作为子目录引入 add_subdirectory(path/to/tiny-dnn) target_link_libraries(your_app PRIVATE tiny_dnn) # 方式二安装后通过 find_package 引入 find_package(tinydnn REQUIRED) target_link_libraries(your_app PRIVATE TinyDNN::tiny_dnn)由于目标是 INTERFACEtarget_link_libraries会自动传递 include 目录无需手工设置include_directories。仓库 examples/CMakeLists.txt 中的所有示例example_mnist_train、example_cifar_train、example_deconv_visual等都是通过target_link_libraries(... ${project_library_target_name} ${REQUIRED_LIBRARIES})这种方式接入的可以作为标准接法参考。可选的 CMake 功能开关仓库根 CMakeLists.txt 第 48~69 行定义了全部用户选项集成时按需开启默认值均为 OFFUSE_SSE/USE_AVX/USE_SERIALIZER/USE_IMAGE_API除外选项说明USE_SSE/USE_AVX/USE_AVX2SIMD 向量化默认 SSE/AVX 开启USE_TBB/USE_OMP多线程后端两者互斥都关闭时使用 C11 标准线程自动加-pthreadUSE_NNPACK/USE_CBLAS/USE_INTEL_MKL可选的矩阵/卷积加速库USE_OPENCL/USE_LIBDNNOpenCL 与 Greentea LibDNN实验性USE_SERIALIZER模型序列化默认开启关闭可加快编译USE_DOUBLE双精度计算USE_GEMMLOWP量化矩阵乘法gemmlowp支持BUILD_TESTS/BUILD_EXAMPLES/BUILD_DOCS/BUILD_BENCHMARKS构建测试、示例、文档与基准集成后的第一个可用程序构建 → 预测 → 保存/加载集成完成只是开始。把模型跑起来同样只有几步官方入门文档 Getting-started.md 给出了最小工作流。一个可直接编译运行的最小程序如下#include tiny_dnn/tiny_dnn.h using namespace tiny_dnn; using namespace tiny_dnn::layers; using namespace tiny_dnn::activation; int main() { // 1. 声明模型sequential线性堆叠各层 networksequential net; // 2. 用 运算符堆叠层 net conv(32, 32, 5, 1, 6, padding::same) tanh() max_pool(32, 32, 6, 2) tanh() fc(8 * 8 * 16, 100) tanh() fc(100, 10) softmax(); // 3. 声明优化器 adagrad opt; // 4. 训练fit 需要目标向量train 接受类别 id // net.fitcross_entropy(opt, x_data, y_data, batch, epochs); // net.traincross_entropy, adagrad(opt, x_data, y_label, batch, epochs); // 5. 预测 auto y_vector net.predict(x_data); auto y_label net.predict_max_label(x_data); // 6. 保存 / 加载模型 net.save(my-network); // networksequential net2; // net2.load(my-network); return 0; }完整可运行示例见 examples/mnist/train.cppLeNet 卷积网络 MNIST 数据集端到端训练它演示了parse_mnist_images数据解析、nn.trainmse(...)训练回调、nn.test(...)评估与nn.save(LeNet-model)持久化的完整链路。模型持久化的底层实现save/load的默认签名定义在 tiny_dnn/network.h 第 676~728 行void save(const std::string filename, content_type what content_type::weights_and_model, file_format format file_format::binary) const; void load(const std::string filename, content_type what content_type::weights_and_model, file_format format file_format::binary);content_type支持weights仅权重、model仅网络结构、weights_and_model默认两者都保存file_format支持binary默认、portable_binary跨平台可移植二进制、json便于阅读与版本对比底层基于随仓库分发的 cereal 序列化库cereal并且#ifndef CNN_NO_SERIALIZATION保护意味着一旦在config.h中定义了CNN_NO_SERIALIZATION调用save/load会抛出nn_error(tiny-dnn was not built with Serialization support)。集成时的几个实践要点编译优化等级深度学习代码对优化敏感务必在 Release 模式-O3下使用否则性能会大打折扣CMake 在检测到 Debug 构建时也会给出明确警告见 CMakeLists.txt 第 38~43 行。无动态依赖tiny-dnn 除可选加速库TBB、OpenMP、NNPACK、OpenCL、CBLAS/MKL、gemmlowp外没有任何强制依赖默认配置下只需标准库这一特性尤其适合嵌入式与资源受限场景也意味着接入你的应用不会引入包管理或运行时部署负担。集成友好性README 明确列出框架面向真实应用集成的设计承诺——不向 stdout/stderr 输出除非启用CNN_USE_STDOUT、恒定吞吐、可在不抛异常的模式下运行这些特性降低了嵌入业务程序时的侵入性。结构一致性保持#include tiny_dnn/tiny_dnn.h的前缀形式并把 include path 指向仓库根目录是让头文件内部相对引用例如tiny_dnn.h中#include tiny_dnn/network.h全部正确解析的最稳妥做法。小结把 tiny-dnn 集成进应用程序的完整路径是一行#include tiny_dnn/tiny_dnn.h 一个符合 C11/14 的编译模式 一条指向仓库根目录的 include path。三步之外你可以借助config.h的编译宏或 CMake 选项按需裁剪功能再通过networksequential/networkgraph构建模型、用predict/train/save/load完成推理与持久化。由于框架本身 header-only 且无强制依赖这套集成方案可以平滑落入从桌面工具到嵌入式固件的各类 C 项目中。赞分享人工智能深度学习嵌入式【免费下载链接】tiny-dnnheader only, dependency-free deep learning framework in C14项目地址https://gitcode.com/gh_mirrors/ti/tiny-dnn点击查看免费下载相关推荐iMac Pro 1,1 越狱T2 芯片设备 palera1n 高级教程iMac Pro 1,1 越狱T2 芯片设备 palera1n 高级教程 引言T2 芯片设备越狱的挑战与解决方案 你是否曾因 iMac Pro 1,1 无法人工智能深度学习嵌入式RetDec 中 Eigen 数学库的引入与深度解析仅保留头文件的线性代数子集及其在 x87 FPU 反编译优化中的实战应用RetDec 中 Eigen 数学库的引入与深度解析仅保留头文件的线性代数子集及其在 x87 FPU 反编译优化中的实战应用 本文围绕 RetDec 仓库中逆向工程静态分析TVM 中文教程从入门到精通的深度学习编译器指南TVM 中文教程从入门到精通的深度学习编译器指南 什么是TVM TVM是一个开源的深度学习编译器堆栈它能够将深度学习模型高效地部署到各种硬件后端。作为深度学文档教程上一篇罗技鼠标压枪脚本技术解码自动化后坐力控制系统的实现机制下一篇终极Zotero插件市场在Zotero内一键管理所有插件的完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进