# toynet **Repository Path**: vonchenchen/toynet ## Basic Information - **Project Name**: toynet - **Description**: 用C++14实现的轻量级神经网络库,支持计算图、自动微分、多种激活函数和损失函数。 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-08-27 - **Last Updated**: 2026-02-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ToyNet 这个项目是学习[《用python实现深度学习框架》](https://github.com/zc911/MatrixSlow)的笔记。 用C++14实现的轻量级神经网络库,支持计算图、自动微分、多种激活函数和损失函数。 ## 项目简介 ToyNet是一个实验性质的神经网络库,实现了从零开始的神经网络核心功能,包括: - 计算图和自动微分 - 矩阵运算库 - 多种神经网络层 - 常用激活函数 - 损失函数 - 优化器 - 数据集加载和特征编码器 ## 编译环境 - C++14标准 - CMake 3.10+ ## 编译方法 ```bash mkdir build cd build cmake .. make ``` 编译完成后,生成可执行文件 `toynet` ## 项目结构 ``` toynet/ ├── src/ │ ├── toy_core_math.h/cc # 数学运算库(矩阵操作) │ ├── toy_core_net.h # 神经网络核心(计算图、节点、层) │ ├── toy_core_log.h/cc # 日志系统 │ ├── toy_util_csv_parser.h # CSV文件解析 │ ├── toy_util_feature_encoder.h/cc # 特征编码器 │ ├── minist/ │ │ └── toy_util_minist_reader.h/cc # MNIST数据集读取 │ └── main.cc # 主测试文件 ├── resource/ │ ├── Iris.csv # 鸢尾花数据集 │ └── MNIST_data.zip # MNIST手写数字数据集 ├── doc/ │ └── images.drawio # 图表文件 ├── CMakeLists.txt └── readme.md ``` ## 核心功能 ### 1. 计算图和自动微分 实现了基于计算图的自动微分系统,支持前向传播和反向传播: - **节点类型**: - `ValueNode`: 值节点(可训练参数) - `OperatorAddNode`: 加法操作 - `OperatorMatMulNode`: 矩阵乘法 - `OperatorMultiplyNode`: 逐元素乘法 - `OperatorScalarMulNode`: 标量乘矩阵 - `OperatorReshapeNode`: 重塑操作 - `OperatorConcatenateNode`: 拼接操作 - **激活函数**: - `LogisticNode`: Sigmoid激活函数 - `ReLUNode`: ReLU激活函数 - `SoftMaxNode`: SoftMax激活函数 - **损失函数**: - `PerceptionLossNode`: 感知机损失 - `LogLossNode`: 对数损失 - `CrossEntropyLossSoftMaxNode`: 交叉熵损失(配合SoftMax) ### 2. 矩阵运算库 `toy_core_math.h` 提供了基础的矩阵运算功能: - 矩阵加减乘除 - 矩阵转置 - 矩阵重塑 - 矩阵拼接 - 元素级运算 - 正态分布随机初始化 ### 3. 神经网络层 - **全连接层(Fully Connected Layer)**: 支持多种激活函数 ### 4. 工具类 - **CSV解析器**: 解析CSV格式的数据文件 - **特征编码器**: One-hot编码等特征处理 - **MNIST读取器**: 读取MNIST手写数字数据集 ## 使用示例 ### 基本矩阵运算 ```cpp #include "toy_core_math.h" using namespace toy; Mat m1({1, 2, 3, 4, 5, 6}, 2, 3); Mat m2({1, 2, 3, 4, 5, 6}, 3, 2); Mat result = m1 * m2; std::cout << result.toString() << std::endl; ``` ### 构建简单的神经网络 ```cpp #include "toy_core_net.h" using namespace toy; ComputationalGraph> graph; // 创建输入节点 ValueNode> input(Mat({0.1f, 0.2f, 0.3f}, 3, 1)); // 创建全连接层(输入维度3,输出维度4,ReLU激活) FullConnectionLayer, float> layer(graph, input, 3, 4, LAYER_ACTIVATION::RELU); // 前向传播 layer.getResultNode()->forward(); // 反向传播 input.backward(layer.getResultNode()); ``` ### 训练示例 项目 `main.cc` 中包含多个训练示例: 1. **ADALINE分类**: 自适应线性神经元分类 2. **逻辑回归**: 使用鸢尾花数据集进行多分类 3. **神经网络分类**: 使用鸢尾花数据集 4. **MNIST手写数字识别**: 使用MNIST数据集 在 `main.cc` 中取消注释相应的函数调用即可运行示例。 ## 测试用例 `main.cc` 中包含丰富的测试用例: - 基础节点测试 - 运算符测试(加法、矩阵乘法、标量乘法、逐元素乘法) - 激活函数测试(Logistic、ReLU、SoftMax) - 损失函数测试(LogLoss、PerceptionLoss、CrossEntropyLoss) - 重塑和拼接操作测试 - 全连接层测试 - 工具函数测试 ## 数据集 ### Iris数据集 位置: `resource/Iris.csv` 鸢尾花数据集,包含150个样本,3个类别,用于分类任务示例。 ### MNIST数据集 位置: `resource/MNIST_data.zip` MNIST手写数字数据集,包含60000个训练样本和10000个测试样本。 ## 日志系统 项目内置了日志系统,支持多个日志级别: ```cpp LogMsg::setLevel(TRACE); // 设置日志级别 LOG(INFO) << "This is an info message"; LOG(ERROR) << "This is an error message"; ``` 日志级别:TRACE、DEBUG、INFO、WARN、ERROR、FATAL ## 注意事项 - 这是一个教学性质的神经网络库,不适用于生产环境 - 性能未做深度优化,主要用于理解神经网络原理 - 使用C++14标准编译 - 编译选项使用 `-O3` 优化 ## 许可证 本项目仅供学习交流使用。 ## 作者 vonchenchen@163.com ## 更新日志 - 初始版本:实现基础的神经网络功能