该项目在 C 语言中实现了一个最小的神经网络,用于对 MNIST 数据集中的手写数字进行分类。整个实现是 ~200 行代码,并且只使用标准 C 库。
主要功能
- 两层神经网络(输入 → 隐藏→输出)
- 隐藏层的 ReLU 激活函数
- 输出层的 Softmax 激活函数
- 交叉熵损失函数
- 随机梯度下降 (SGD) 优化器
性能
Epoch 1, Accuracy: 95.61%, Avg Loss: 0.2717, Time: 2.61 seconds
Epoch 2, Accuracy: 96.80%, Avg Loss: 0.1167, Time: 2.62 seconds
Epoch 3, Accuracy: 97.21%, Avg Loss: 0.0766, Time: 2.66 seconds
Epoch 4, Accuracy: 97.38%, Avg Loss: 0.0550, Time: 2.64 seconds
Epoch 5, Accuracy: 97.49%, Avg Loss: 0.0397, Time: 2.64 seconds
Epoch 6, Accuracy: 97.47%, Avg Loss: 0.0285, Time: 2.65 seconds
Epoch 7, Accuracy: 97.47%, Avg Loss: 0.0205, Time: 2.66 seconds
Epoch 8, Accuracy: 97.72%, Avg Loss: 0.0151, Time: 2.66 seconds
Epoch 9, Accuracy: 97.88%, Avg Loss: 0.0112, Time: 2.67 seconds
Epoch 10, Accuracy: 97.82%, Avg Loss: 0.0084, Time: 2.67 seconds
Epoch 11, Accuracy: 97.88%, Avg Loss: 0.0063, Time: 2.68 seconds
Epoch 12, Accuracy: 97.92%, Avg Loss: 0.0049, Time: 2.68 seconds
Epoch 13, Accuracy: 97.92%, Avg Loss: 0.0039, Time: 2.69 seconds
Epoch 14, Accuracy: 98.02%, Avg Loss: 0.0032, Time: 2.69 seconds
Epoch 15, Accuracy: 98.06%, Avg Loss: 0.0027, Time: 2.70 seconds
Epoch 16, Accuracy: 98.09%, Avg Loss: 0.0024, Time: 2.70 seconds
Epoch 17, Accuracy: 98.11%, Avg Loss: 0.0021, Time: 2.69 seconds
Epoch 18, Accuracy: 98.12%, Avg Loss: 0.0019, Time: 2.70 seconds
Epoch 19, Accuracy: 98.16%, Avg Loss: 0.0017, Time: 2.70 seconds
Epoch 20, Accuracy: 98.17%, Avg Loss: 0.0015, Time: 2.71 seconds
安装和使用
-
GCC 编译器
-
MNIST 数据集文件:
train-images.idx3-ubyte
train-labels.idx1-ubyte
编译
gcc -O3 -march=native -ffast-math -o nn nn.c -lm
使用
-
将 MNIST 数据集文件放在目录中。
data/
-
编译程序。
-
运行可执行文件:
./nn
该程序将在 MNIST 数据集上训练神经网络,并输出每个 epoch 的准确率和平均损失。
配置
您可以在 中调整以下参数:nn.c
HIDDEN_SIZE
:隐藏层中的神经元数LEARNING_RATE
:SGD 的学习率EPOCHS
:训练 epoch 的数量BATCH_SIZE
:用于训练的小批量大小TRAIN_SPLIT
:用于训练的数据比例(其余用于测试)