# minnet **Repository Path**: applezyh/minnet ## Basic Information - **Project Name**: minnet - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-30 - **Last Updated**: 2022-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 基于C++的深度学习框架: minnet ### 1. 框架配置 该框架基于C++20标准实现,除了demo对图像的读写和显示功能会用到OpenCV库之外没有其他外部依赖。 无论在Windows还是Linux操作系统下,需要保证您的编译器支持C++20标准,如果想要运行演示程序,需要安装OpenCV。 构建方法: 根目录运行: ```shell mkdir build && cd build && cmake .. && make ``` Windows环境下可以右键单击minnet文件夹,选择使用Visual Studio打开,依次点击 项目->全部重新生成->运行程序。确保在高优化的编译配置下编译运行程序,避免演示程序运行时间过长。 完成项目构建,构建完成后可以在`根目录/build/src`目录下找到对应的静态链接库文件`lib_minnet.a`。如果运行机器安装有OpenCV您也可以在`根目录/build/example`目录下找到对应的演示程序,演示程序将基于mnist数据集进行训练并且输出测试结果。 运行演示程序需要提前安装OpenCV,并且准备好mnist数据集,项目提供mnist数据集下载脚本。使用python(版本要求3.X)运行`example/script/download_mnist.py`脚本,会自动下载模拟试题数据集到`example/mnist`文件夹下。 关于OpenCV的安装,这里给出Linux环境下源码安装的方式,同样安装OpenCV需要保证安装环境配置有cmake。其他环境的不同安装方法在网络上都容易寻找到,在此便不再赘述。 ```shell // 选择合适的安装目录 // 在OpenCV项目根目录下 git clone git@gitee.com:mirrors/opencv.git && cd opencv && mkdir build && cd build && cmake .. && make install // 运行上述命令然后等待OpenCV编译安装 ``` 运行演示程序需要在命令行给出mnist数据集所在的目录路径,以在根目录下运行演示程序为例。 ```shell ./build/example/cnn_demo ./example/mnist/ ``` 演示程序会利用mnist训练集进行模型训练,并且在测试集上进行测试。模型配置如下: ```C++ class CNN :public minnet::model::Model { public: CNN() { seq = minnet::model::Sequence( minnet::model::Conv2d(3, 1), minnet::model::Relu(), minnet::model::MaxPool2d(2), minnet::model::Conv2d(3, 3), minnet::model::Relu(), minnet::model::MaxPool2d(2) ); fc1 = minnet::model::Linear(3 * (7 * 7), 10); register_layer(seq, fc1); } minnet::Tensor Forward(minnet::Tensor& input) override { minnet::Tensor out = seq(input); out = out.reshape(1, -1); return fc1(out); } private: minnet::model::Sequence seq; minnet::model::Linear fc1; }; ``` 框架语法与pytorch类似,需要注意的是对于新加的层必须使用`add_layer()`方法将该层加入模型参数列表,否则该层不会被优化器得到,参数也永远不会更新。 感兴趣可以修改模型配置重新编译运行演示程序。由于目前还不支持批量训练,因此每次仅能输入一个数据,具体形式参考`example/MinNet.cpp`源文件内容。 ### 2. 目录结构 * src目录下存放着框架核心代码。 * Tensor: 框架核心数据结构 * Optimizer: 优化器,目前只实现了SGD优化器 * Layer: 模型核心数据结构,卷积层、全连接层、DropOut层和模型基类 * Function: 常用损失函数 * include目录存放着对应头文件 * example目录下存放着演示程序,想要编译运行需要安装OpenCV ### 3.框架结构 构建以动态图的形式构建神经网络,只有在运算发生时网络才会构建。 核心数据结构Tensor类,该类重载了加、减、乘、除、卷积、矩阵乘法...等运算,并且根据运算完成自动求导,最终实现构建神经网络。神经网络最为核心的前向传播和反向传播功能均由此数据结构实现。 // TODO() 如果您对该框架感兴趣,不妨联系我说出您的想法与问题。email:applezyh@outlook.com