Genann 实战教程:从零开始训练 XOR 和 IRIS 分类器
【免费下载链接】genannsimple neural network library in ANSI C项目地址: https://gitcode.com/gh_mirrors/ge/genann
Genann 是一个轻量级的 ANSI C 神经网络库,专注于简洁、快速和可靠的前馈神经网络训练与使用。本文将通过两个经典案例——XOR 函数拟合和 IRIS 数据集分类,带你快速掌握 Genann 的核心用法,即使你是神经网络新手也能轻松上手。
为什么选择 Genann?✨
Genann 作为一款极简神经网络库,具有以下优势:
- 零依赖:仅需
genann.c和genann.h两个文件即可集成到任何 C 项目 - 超轻量:代码简洁易懂,适合学习神经网络底层原理
- 高效训练:支持反向传播和随机搜索等多种训练方式
- 灵活扩展:所有权重存储在连续内存块,便于自定义优化算法
神经网络基础:从结构开始认识 Genann 🧠
在开始实战前,我们先了解 Genann 构建的神经网络结构。一个典型的 Genann 网络由输入层、隐藏层和输出层组成,层与层之间通过权重连接。
图:具有2个输入、3个隐藏神经元和2个输出的神经网络结构(Genann 官方示例)
核心概念解析
- 输入层:接收原始数据,如 XOR 问题中的两个二进制输入
- 隐藏层:通过非线性变换提取特征,层数和神经元数量可自定义
- 输出层:产生预测结果,如分类问题中的类别概率
- 权重:连接神经元的参数,通过训练不断优化
实战一:5分钟实现 XOR 函数拟合 ⚡
XOR(异或)是神经网络的"Hello World",通过这个简单案例可以快速掌握 Genann 的基本流程。
准备工作:获取 Genann 源码
git clone https://gitcode.com/gh_mirrors/ge/genann cd genann实现步骤
定义网络结构
XOR 问题需要 2 个输入(二进制值)和 1 个输出(异或结果),我们使用 1 个隐藏层(含 2 个神经元):genann *ann = genann_init(2, 1, 2, 1); // 输入数, 隐藏层数, 隐藏层神经元数, 输出数准备训练数据
XOR 函数的全部可能输入与输出:const double input[4][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}}; const double output[4] = {0, 1, 1, 0}; // 异或结果训练网络
使用反向传播算法训练 500 轮,学习率设为 3.0:for (i = 0; i < 500; ++i) { genann_train(ann, input[0], output + 0, 3); genann_train(ann, input[1], output + 1, 3); genann_train(ann, input[2], output + 2, 3); genann_train(ann, input[3], output + 3, 3); }验证结果
运行训练好的网络并输出预测结果:printf("Output for [0, 0] is %1.f\n", *genann_run(ann, input[0])); printf("Output for [0, 1] is %1.f\n", *genann_run(ann, input[1])); // 其他输入...
完整代码参考
Genann 项目中已包含 XOR 示例:example1.c,你可以直接编译运行:
make example1 ./example1实战二:IRIS 数据集分类实战 📊
IRIS 数据集是经典的多类别分类问题,包含 3 种鸢尾花的 4 个特征数据,我们将用 Genann 实现花朵品种识别。
数据集介绍
IRIS 数据集位于项目的example/iris.data,每条记录包含:
- 4 个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
- 1 个类别标签:山鸢尾、变色鸢尾、维吉尼亚鸢尾
实现步骤
加载数据
示例代码 example4.c 提供了完整的数据加载功能,将特征和标签分别存储在input和class数组中。设计网络结构
针对 4 个输入特征和 3 个输出类别,我们使用 1 个隐藏层(含 4 个神经元):genann *ann = genann_init(4, 1, 4, 3); // 4输入, 1隐藏层, 4神经元/层, 3输出训练模型
使用较小的学习率(0.01)和更多训练轮次(5000 次):for (i = 0; i < 5000; ++i) { // 5000轮训练 for (j = 0; j < samples; ++j) { // 遍历所有样本 genann_train(ann, input + j*4, class + j*3, 0.01); } }评估准确率
计算模型在训练集上的分类准确率:int correct = 0; for (j = 0; j < samples; ++j) { const double *guess = genann_run(ann, input + j*4); // 判断预测类别是否正确... } printf("%d/%d correct (%0.1f%%)\n", correct, samples, (double)correct/samples*100);
运行与优化
编译并运行 IRIS 分类示例:
make example4 ./example4通常能达到 95% 以上的准确率!如果结果不理想,可以尝试:
- 调整隐藏层数量和神经元数
- 修改学习率(如 0.001-0.1 之间)
- 增加训练轮次
- 尝试随机搜索训练(参考 example2.c)
Genann 常用 API 速查表 📝
| 函数 | 功能 |
|---|---|
genann_init() | 创建新神经网络 |
genann_train() | 反向传播训练 |
genann_run() | 前向传播预测 |
genann_write()/genann_read() | 保存/加载模型 |
genann_free() | 释放网络内存 |
总结与扩展学习 🚀
通过本文的两个实例,你已经掌握了 Genann 的核心用法。这个轻量级库虽然简单,但包含了神经网络的基本原理,非常适合学习和嵌入式应用。
进阶方向
- 尝试修改 example3.c 实现模型的保存与加载
- 探索随机搜索等替代训练方法(example2.c)
- 自定义激活函数(修改
genann.c中的genann_act())
Genann 的全部代码和更多细节可在项目文件中查看:
- 核心实现:genann.c、genann.h
- 测试代码:test.c
现在,你已经准备好用 Genann 构建自己的神经网络应用了!无论是简单的函数拟合还是复杂的分类任务,这个小巧而强大的库都能满足你的需求。
【免费下载链接】genannsimple neural network library in ANSI C项目地址: https://gitcode.com/gh_mirrors/ge/genann
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考