编译和测试使用tiny-dnn库构建XOR神经网络

⌚Time: 2026-01-15 21:03:00

👨‍💻Author: Jack Ge

简介

tiny-dnn 是一个用 C++ 编写的轻量级、无依赖的深度学习库,专注于在资源受限环境下提供快速、可嵌入的神经网络实现。它完全使用模板和头文件实现,不依赖像 CUDA 或 BLAS 这样的外部库,因此易于移植和集成。

tiny-dnn 支持常用的神经网络层和功能,包括全连接层(fully connected)、卷积层(convolutional)、池化层(pooling)、激活函数(ReLU、Sigmoid、Tanh)以及 dropout、batch normalization 等。它适合用于图像分类、回归以及小型深度学习任务的原型开发。

tiny-dnn 提供简单直观的接口,用户可以快速定义网络结构、加载训练数据、执行前向传播和反向传播训练。虽然它不如 TensorFlow、PyTorch 功能全面,但其 轻量、易嵌入和跨平台 的特点,使它非常适合嵌入式系统、C++ 项目和教育教学用途。

此外,tiny-dnn 也支持序列化网络模型、保存训练结果,以及与 OpenCV 等库结合处理图像数据,是一个高效、便捷的轻量级深度学习解决方案。

下载和编译

tiny-dnn的github地址:https://github.com/tiny-dnn/tiny-dnn

直接拉取源码,解压。用到cmakemingw进行编译。需要电脑提前安装。

解压tiny-dnn的源码,打开cmake-gui,选择源码目录,设置1个输出目录。点击configure,选择本地的编译系统的项目文件。对于mingw就选mingw makefile

configure完成后出现红色条目,可以改一些参数,比如安装路径,之后再点击1次configure,条目恢复颜色,之后点击generate。就会产生makefile文件在输出目录。

在输出目录使用cmd进行编译和安装

mingw32-make
mingw32-make install

安装很快,之后到安装目录下可以找到编译好的库文件。实际上生成的库只有1个CMAKE和1个include文件夹,因为这是1个Header-only Library,使用只需要包含它的头文件就行了。

另外,我测试这个tiny-dnn库在编译c程序的时候需要另外一个库叫cereal,需要下载,它的github地址是:https://github.com/USCiLab/cereal

将源码拉取,解压,就可以使用了,这同样是1个Header-only Library,使用只需要包含它的头文件就行了。

测试

使用这个代码训练1个简单的XOR神经网络

#include <iostream>
#include "tiny_dnn/tiny_dnn.h"

int main() {
    using namespace tiny_dnn;
    using namespace tiny_dnn::activation;

    // 1. 网络结构
    network<sequential> nn;
    nn << fully_connected_layer(2, 8) << sigmoid_layer()
       << fully_connected_layer(8, 1) << sigmoid_layer();

    // 2. XOR 输入
    std::vector<vec_t> input_data = {
        {0.0f, 0.0f},
        {0.0f, 1.0f},
        {1.0f, 0.0f},
        {1.0f, 1.0f}
    };

    // 3. XOR 目标
    std::vector<vec_t> target_data = {
        {0.0f},
        {1.0f},
        {1.0f},
        {0.0f}
    };

    // 4. 优化器
    gradient_descent optimizer;
    optimizer.alpha = 0.5f;

    // 5. 训练
    for (int epoch = 0; epoch < 5000; ++epoch) {
        nn.train<mse>(optimizer, input_data, target_data, 4, 1);

        if (epoch % 100 == 0) {
            float loss = nn.get_loss<mse>(input_data, target_data);
            std::cout << "epoch " << epoch
                      << " loss = " << loss << std::endl;
        }
    }

    // 6. 最终预测
    std::cout << "\nFinal XOR predictions:\n";
    for (auto &x : input_data) {
        auto r = nn.predict(x);
        std::cout << x[0] << " XOR " << x[1]
                  << " = " << r[0] << std::endl;
    }

    return 0;
}

一开始我训练用的是

nn.train<mse>(optimizer, input_data, target_data, 4, 5000);

这种看不到训练过程,这个函数有回调函数版本可以显示进程,但是我直接使用AI提供的办法手动进行每轮训练打印进程了。

编译链接很简单,只需要包含tiny-dnn和cereal的头文件目录就行了

g++ main.cpp -ID:\BuildTools\cereal-1.3.2\include -ID:\BuildTools\tiny-dnn\Include

执行程序,训练结果

a.exe
epoch 0 loss = 1.07502
epoch 100 loss = 1.00109
epoch 200 loss = 0.999305
epoch 300 loss = 0.997307
epoch 400 loss = 0.994354
epoch 500 loss = 0.989121
epoch 600 loss = 0.979021
epoch 700 loss = 0.959742
epoch 800 loss = 0.925775
epoch 900 loss = 0.872105
epoch 1000 loss = 0.798641
epoch 1100 loss = 0.711319
epoch 1200 loss = 0.612481
epoch 1300 loss = 0.502056
epoch 1400 loss = 0.389389
epoch 1500 loss = 0.290746
epoch 1600 loss = 0.215102
epoch 1700 loss = 0.161209
epoch 1800 loss = 0.123687
epoch 1900 loss = 0.0973911
epoch 2000 loss = 0.0785871
epoch 2100 loss = 0.0648068
epoch 2200 loss = 0.0544567
epoch 2300 loss = 0.0465032
epoch 2400 loss = 0.040264
epoch 2500 loss = 0.0352792
epoch 2600 loss = 0.0312315
epoch 2700 loss = 0.0278974
epoch 2800 loss = 0.0251158
epoch 2900 loss = 0.0227689
epoch 3000 loss = 0.0207686
epoch 3100 loss = 0.0190482
epoch 3200 loss = 0.0175563
epoch 3300 loss = 0.016253
epoch 3400 loss = 0.0151068
epoch 3500 loss = 0.0140926
epoch 3600 loss = 0.0131901
epoch 3700 loss = 0.0123829
epoch 3800 loss = 0.0116575
epoch 3900 loss = 0.0110027
epoch 4000 loss = 0.0104094
epoch 4100 loss = 0.00986961
epoch 4200 loss = 0.00937689
epoch 4300 loss = 0.00892565
epoch 4400 loss = 0.00851116
epoch 4500 loss = 0.0081293
epoch 4600 loss = 0.00777659
epoch 4700 loss = 0.00744998
epoch 4800 loss = 0.00714681
epoch 4900 loss = 0.00686479

Final XOR predictions:
0 XOR 0 = 0.0332519
0 XOR 1 = 0.956773
1 XOR 0 = 0.962763
1 XOR 1 = 0.0473664

正确的输出了预测结果