ILearnDeepLearning.py
从零手写神经网络,用 NumPy 拆解深度学习的数学本质
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
从零手写神经网络,用 NumPy 拆解深度学习的数学本质
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

图1:ILearnDeepLearning.py 项目 Logo — 用动画展示神经网络训练过程
这是一个以"亲手实现,不依赖框架"为核心理念的深度学习教学仓库,作者 Piotr Skalski 通过纯 NumPy 代码手写神经网络,同时配套 Keras/TensorFlow 对比实验,并配以 Medium 文章和动态可视化,帮助学习者在实践中真正理解深度学习的数学本质。
2018 年,波兰 ML 工程师 Piotr Skalski 在阅读 Keras、TensorFlow 文档时产生了一个困惑:高层 API 把一切都封装得太好,好到让人"知其然,不知其所以然"。他决定把轮子拆开看——用 Python 列表和 NumPy 数组,手写一个完整的前馈神经网络,包括前向传播、损失计算、反向传播和参数更新。
这个决定催生了 ILearnDeepLearning.py 项目。项目名称本身就是一个宣言:不是用别人的库"跑通"深度学习,而是从零开始"学懂"深度学习。Skalski 将代码与 Medium 博客文章绑定发布,每篇文章对应一个代码模块,形成"理论 + 可视化 + 亲手实现"的三位一体学习路径。
如今 Piotr Skalski 已担任 Roboflow 的开源负责人,并创立了 makesense.ai,但他最初这套教学代码仍在持续被人学习和 Fork,成为深度学习入门领域的经典资源之一。
项目分为两大模块,共 10 个子项目:
这是整个仓库最核心的部分,6 个子项目逐层深入:
| 子项目 | 内容 | 技术亮点 |
|---|---|---|
| 01_mathematics_of_nn | 梯度下降、激活函数、分类边界可视化 | Keras 模型逐轮输出 GIF 动画 |
| 02_exploring_overfitting | 过拟合与正则化 | 对比实验 + 可视化 |
| 03_numpy_neural_net | 纯 NumPy 从零实现神经网络 | 无任何 ML 框架依赖 |
| 04_optimizers | SGD / Adam / RMSProp 等优化器对比 | 动态 GIF 可视化收敛过程 |
| 05_mathematics_of_cnn | 卷积神经网络数学原理 | 图解卷积核、池化操作 |
| 06_numpy_convolutional_neural_net | 纯 NumPy 实现 CNN | 从卷积到全连接层全部手写 |
| 子项目 | 内容 | 技术亮点 |
|---|---|---|
| 01_animated_graphs | 动态图表生成 | Matplotlib 动画 |
| 02_yolo_object_detection | YOLOv3 自定义目标检测 | 提供 Dockerfile,支持国际象棋、篮球等自定义数据集训练 |
| 03_explaining_image_classifier_predictions | CNN 预测可解释性分析 | Grad-CAM 类激活可视化 |
| 04_random_forest__IN_PROGRESS | 随机森林(进行中) | - |
03_numpy_neural_net 模块是整个仓库的灵魂。它用约 300 行纯 NumPy 代码实现了完整的神经网络,没有任何 torch.nn、tf.keras 或其他 ML 框架依赖:
# 纯 NumPy 前向传播
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
def sigmoid_derivative(a):
return a * (1.0 - a)
# 训练循环
for epoch in range(epochs):
# Forward
layer1 = sigmoid(np.dot(X, W1) + b1)
output = sigmoid(np.dot(layer1, W2) + b2)
# Backward
output_error = Y - output
output_delta = output_error * sigmoid_derivative(output)
# ... 参数更新
这段代码的工程价值在于:它让读者真正理解 BP 算法的矩阵运算本质——每一行代码都可以对应到吴恩达课程中的数学公式。通过与同目录下 Keras 实现对比(numpy_vs_keras_comparison.png),学习者可以直观看到纯 NumPy 实现与生产级框架的性能差距。
02_yolo_object_detection 模块提供了完整的 YOLOv3 自定义训练流程,支持检测任意物体。模块自带 4 个下载脚本,分别获取篮球、国际象棋等预训练模型和数据集,并配有 Dockerfile:
FROM ubuntu:16.04
RUN pip3 install Cython numpy "pillow<7"
RUN git clone https://github.com/ultralytics/yolov3.git
Linux 用户可直接运行 bash setup_yolo_framework.sh,Windows/Mac 用户通过 Docker 构建环境。这是项目中唯一具备容器化支持的子模块。
作者充分利用 Matplotlib 动画功能,将抽象的数学过程转化为直观动画:

图2:不同优化器(SGD、Adam、RMSProp)的收敛轨迹动画对比 — 直观展示各优化器的寻优行为差异

图3:梯度下降过程可视化 — 展示参数在 Loss 曲面上的移动轨迹,帮助理解学习率和动量的作用
git clone https://github.com/SkalskiP/ILearnDeepLearning.py.git
cd ILearnDeepLearning.py
python3 -m venv .env && source .env/bin/activate
pip install -r requirements.txt
依赖较多(TensorFlow 1.15、Keras 2.2),首次安装约需 5-10 分钟。值得注意的是 requirements.txt 中的库版本较旧(numpy==1.14.5、TensorFlow 1.15),在新环境中可能遇到兼容性问题,建议使用 conda 或 Docker 环境隔离。
直接在 Jupyter Notebook 中打开对应 .ipynb 文件,按 Cell 顺序逐个运行即可。每个 Notebook 都有详细注释,并配套 Medium 文章链接作为理论背景。没有 Web 界面,完全在 Jupyter 中交互式探索。
requirements.txt 中的 TensorFlow 1.15 已不再维护,Keras 2.2 也已过时。这意味着一些代码在新版 Python(3.10+)上可能无法直接运行。项目中明确标注了 IN_PROGRESS 的模块(随机森林)多年未更新。
纯 NumPy 实现虽然有助于理解原理,但与实际生产环境(PyTorch/JAX)差异巨大。学习者需要清楚认识到:从教学代码到生产代码,中间还有很长距离。
整个仓库没有单元测试或集成测试,代码质量依赖作者个人维护。学习者 Fork 后修改代码缺乏回归保障。
ILearnDeepLearning.py 代表了 ML 教学的一种重要流派:"从零实现"(From-scratch)教学法。这种方法近年来受到越来越多的认可——MIT 6.S191、Fast.ai 等顶级课程都强调理解底层原理而非单纯调用 API。
项目的 1410 颗 Star 说明了一个事实:社区对"手写深度学习"内容有强烈需求。这个仓库持续活跃的原因不在于它解决了某个工程问题,而在于它满足了人类最原始的学习欲望——亲手拆开机器,看看内部是怎么工作的。
对于 AI 爱好者:这是深度学习入门的绝佳补充材料,配合吴恩达课程或《动手学深度学习》一起学习效果最佳。对于 AI 开发者:部分模块(YOLOv3 自定义训练、CNN 预测可解释性分析)可作为项目参考,NumPy 实现可作为面试准备材料。