尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

深度学习课程代码全解析:从numpy手写网络到强化学习实践

发布时间:2026/9/15 0:43:29

资讯中心
01
ARTICLE

深度学习课程代码全解析:从numpy手写网络到强化学习实践

深度学习课程代码全解析:从numpy手写网络到强化学习实践
简介一套面向神经网络与深度学习课程的练习代码资源覆盖线性回归模型、前馈神经网络、卷积神经网络、循环神经网络、注意力机制、高斯混合模型及深度强化学习等经典主题适合高校学生、自学者跟随课程进度动手实践。对应章节包含基于numpy从零实现的全连接网络、用CNN完成MNIST手写数字分类、用RNN进行唐诗生成以及带注意力机制的seq2seq序列逆置等任务并配有题目说明和参考文档。压缩包共60个文件大小约14.15MB主要文件类型为19个ipynb笔记、9个py脚本、11个md说明、12个txt数据文件辅以少量pdf、图片等按章节分目录存放。目前已有248人学习下载。通过完成这些练习可以加深对梯度推导、网络结构设计、训练调试等关键环节的理解是一份不错的课程配套资料。1. 课程练习代码覆盖了什么这套deeplearning-master是一份典型的神经网络与深度学习课程配套代码没有复杂的工程框架每个目录对应一次作业从 numpy 热身一直做到深度强化学习。我拆完整个仓库后发现一个特点它不是给你一个训练好的模型去调参而是把每个经典模型的骨架代码和练习留白放在一起适合想手动复现 forward/backward、理解梯度如何流动的人。尤其适合两类人一是刚开始系统学深度学习、想把“知道”变成“能跑”的学生二是工作中要做模型迁移或调参、需要快速回忆网络结构和损失函数细节的工程师。整个仓库覆盖了线性回归、SVM、Softmax、前馈神经网络、CNN、RNN、注意力机制、高斯混合模型、RBM 和强化学习每个章节的代码风格还不完全一致因为是用不同框架写的有 numpy 手写版本、tf2.0 版、PyTorch 版和 Keras 版。这个差异反而成了看点正好能对比同一网络结构在不同 API 下的实现差异。2. 从 numpy 热身到线性回归与 SVM先解决两个基础问题2.1 numpy 热身到底练什么chap1_warmup里的numpy_tutorial.ipynb看起来很基础但它是整个课程的地基。这个练习涉及切片、广播、矩阵乘法、axis 求和、随机数生成大多数人觉得简单但在后面写前馈神经网络时才发现 numpy 的广播规则没吃透梯度矩阵很容易写错维度。import numpy as np x np.random.randn(5, 3) # 5个样本每个样本3维 w np.random.randn(3, 4) # 权重矩阵 3x4 b np.zeros(4) y np.dot(x, w) b # 广播b自动扩展为(5,4) # 反向传播的第一步对w求梯度 dy np.random.randn(5, 4) dw np.dot(x.T, dy) # 注意转置方向 dx np.dot(dy, w.T)代码逻辑说明np.dot(x, w)做的是样本与权重的线性变换广播机制让 bias 向量直接加到每行上反向传播中x.T dy的维度计算是手写全连接网络最容易出错的地方(3,5) (5,4)得到(3,4)正好与 w 同型。这里练的是张量维度的直觉比背公式管用。2.2 线性回归的 TensorFlow 2.0 实现chap2_linear_regression同时给了exercise和tf2.0两个 notebooktrain.txt是单变量样本。这个章节不建议用高层 API建议手动定义损失函数和梯度因为练习内容就是看你能不能把线性回归写成可扩展的形式。import tensorflow as tf w tf.Variable(tf.random.normal([1]), nameweight) b tf.Variable(tf.zeros([1]), namebias) learning_rate 0.01 def loss_fn(X, y): y_pred w * X b return tf.reduce_mean(tf.square(y - y_pred)) for step in range(1000): with tf.GradientTape() as tape: loss loss_fn(X, y) grads tape.gradient(loss, [w, b]) w.assign_sub(learning_rate * grads[0]) b.assign_sub(learning_rate * grads[1]) if step % 100 0: print(fstep {step}: loss{loss.numpy():.4f})这段代码的逻辑是每轮用GradientTape记录 loss 对 w 和 b 的导数再用assign_sub做参数更新reduce_mean对 batch 内样本求平均避免 batch 大小影响学习率。训练 1000 轮是因为数据是线性生成的收敛速度很快。2.3 SVM 和 Softmax从回归走向分类chap3_SVM中的svm.py用的是 sklearn 的SVC。这个目录放的位置很有意思它是放在线性回归之后、神经网络之前说明课程想让学生先理解线性可分和决策边界再进入非线性模型。svm.py的核心就是定义核函数和 C 参数。对文本或向量数据RBF 核基本默认有效但要注意 C 值不要盲目调大容易过拟合到训练集。chap3_softmax_regression里有一个练习是手动实现 softmax 交叉熵损失建议看exercise里的实现通常包括三个函数softmax 激活、交叉熵计算、梯度计算。其中softmax数值稳定性的处理值得一提一般会减掉每行的最大值再指数化。logistic_regression-exercise.ipynb则是基础的多分类版本两者可以对照看。def softmax(z): z z - np.max(z, axis1, keepdimsTrue) # 数值稳定 exp_z np.exp(z) return exp_z / np.sum(exp_z, axis1, keepdimsTrue) def cross_entropy_loss(y_true, y_prob): m y_true.shape[0] return -np.sum(y_true * np.log(y_prob 1e-8)) / m参数说明减max不影响 softmax 结果但避免大数溢出1e-8防止 log(0)。理解这两点后再看后面神经网络的分类层会觉得逻辑完全一致。3. 前馈神经网络与 CNN手写反向传播和 MNIST 分类的两种路径3.1 用 numpy 手写全连接网络chap4_ simple neural network里的tutorial_minst_fnn-numpy-exercise.ipynb是整份资源里最有学习价值的一份作业要求用纯 numpy 实现一个两层全连接网络。常见步骤是Xavier 初始化、ReLU 激活、softmax 输出、交叉熵损失、两层反向传播。练习文件里会给梯度的函数签名但实现容易在dw2和db1处翻车。def two_layer_net(X, W1, b1, W2, b2): z1 np.dot(X, W1) b1 a1 np.maximum(0, z1) # relu z2 np.dot(a1, W2) b2 exp_z np.exp(z2 - np.max(z2, axis1, keepdimsTrue)) probs exp_z / np.sum(exp_z, axis1, keepdimsTrue) return a1, probs def two_layer_backward(X, y, a1, probs, W2): m X.shape[0] dz2 (probs - y) / m # softmax cross-entropy 梯度简化 dw2 np.dot(a1.T, dz2) db2 np.sum(dz2, axis0) da1 np.dot(dz2, W2.T) dz1 da1 * (a1 0) # relu 导数 dw1 np.dot(X.T, dz1) db1 np.sum(dz1, axis0) return dw1, db1, dw2, db2代码逻辑说明softmax cross-entropy的反向梯度可以合并为(probs - y) / m这是手工推导过梯度后的简化结果a1 0生成 ReLU 的 mask大于零导数为 1否则为 0。写完后用np.allclose(手动梯度, 数值梯度)验证通过这个检查才算真正理解了反向传播。3.2 Keras 方式的 MNIST 卷积网络chap5_CNN目录下有五种实现方式这里推荐看tutorial_mnist_conv-keras-sequential.ipynb因为它把卷积层、池化层、全连接层的堆叠方式写得很直白适合理解整体流程再用CNN_pytorch.ipynb对照看差异。model tf.keras.Sequential([ tf.keras.layers.Reshape((28, 28, 1), input_shape(784,)), tf.keras.layers.Conv2D(32, kernel_size(3,3), activationrelu), tf.keras.layers.MaxPooling2D(pool_size(2,2)), tf.keras.layers.Conv2D(64, kernel_size(3,3), activationrelu), tf.keras.layers.MaxPooling2D(pool_size(2,2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(10, activationsoftmax) ]) model.compile(optimizeradam, losscategorical_crossentropy, metrics[accuracy])参数说明Conv2D(32)表示第一层用 32 个卷积核kernel_size是感受野大小MaxPooling2D把特征图缩小一半保留局部最显著特征。MNIST 是灰度图所以input_shape是(28,28,1)而不是(28,28,3)。如果你看tutorial_cifar10_conv-keras.ipynb会发现同样的结构用在 CIFAR-10 上输入通道需要改成 3。3.3 卷积网络两个经常忽略的细节这份资源里tutorial_random_filter.ipynb专门讨论了使用随机滤波器提取特征我建议把它当作理解卷积层的辅助实验。看这个 notebook 时注意三个细节卷积核的初始化方式影响结果随机滤波器也能提取边缘信息但要学出有用特征必须通过反向传播更新。另外在对比CNN_tensorflow.ipynb和 PyTorch 版时你会看到两个框架的维度和卷积核参数顺序不一样这在模型迁移时经常踩坑。tutorial_cifar10_conv-keras.ipynb用来练手池化层和 Dropout 关系比较合适。CIFAR-10 是彩色 32x32 图模型会更大容易过拟合通常会在Flatten后加Dropout(0.5)。4. RNN 与注意力机制唐诗生成和序列逆置训练中的关键技巧4.1 唐诗生成任务的数据处理和训练策略chap6_RNN的核心任务是生成唐诗poem_generation_with_RNN-exercise.ipynb和Learn2Carry-exercise.ipynb构成了一个完整的序列建模练习。处理中文诗词和普通文本分类的最大区别在于这里以字为最小单位做 token 化字表大小通常在 2000-6000 之间不容易遇到未登录词问题。char_to_idx {ch: i for i, ch in enumerate(vocab)} idx_to_char {i: ch for i, ch in enumerate(vocab)} for i in range(len(text) - seq_length): seq_in text[i:i seq_length] seq_out text[i seq_length] X.append([char_to_idx[ch] for ch in seq_in]) y.append(char_to_idx[seq_out]) # 模型结构embedding - rnn - dense model tf.keras.Sequential([ tf.keras.layers.Embedding(len(vocab), 128), tf.keras.layers.SimpleRNN(256, return_sequencesFalse), tf.keras.layers.Dense(len(vocab), activationsoftmax) ])seq_length通常取 20 到 50太长训练慢太短学不到句间依赖Embedding的 128 是字向量维度维度越高能表达更多语义但参数量增大。训练时用categorical_crossentropy做损失函数因为输出是对下一个字的整个字表做分类。注意推理时的采样方式用np.random.choice按概率采样会比argmax生成的诗句更有多样性。4.2 seq2seq 序列逆置与注意力机制chap7-seq2seq-and-attention里的任务是字符串序列逆置比如输入abc输出cba。这个任务看起来简单但能很好地暴露 RNN 网络的长期记忆问题。sequence_reversal-exercise.ipynb用普通 seq2seqsequence_reversal_with_attention-exercise.ipynb加了注意力机制两个文件对比正好说明“注意力是怎么解决信息压缩瓶颈的”。# 手动实现加性注意力 scoring def attention_score(decoder_hidden, encoder_outputs): # decoder_hidden: (batch, hidden_dim) # encoder_outputs: (batch, time_steps, hidden_dim) expand_hidden tf.expand_dims(decoder_hidden, 1) # (batch, 1, hidden) energy tf.reduce_sum(tf.tanh(expand_hidden encoder_outputs), axis-1) return tf.nn.softmax(energy, axis-1)代码逻辑说明decoder_hidden与每个时间步的encoder_outputs相加形成决策模式通过tanh变换后降维得到每个时间步的能量分数用softmax转成注意力权重。这里是加性注意力机制也就是 Bahdanau Attention。加性注意力和乘性注意力的核心差别在于 score 函数的计算方式加性注意力适合隐藏维度较大的场景乘性通过点积实现更高效。训练时常用的一个技巧是teacher forcing也就是在解码阶段用真实目标词作为当前步输入而不是上一步的预测结果。这会加速收敛但预测阶段会出现暴露偏差问题因为生成时没有真实序列可用。处理方式一般是训练前期用 teacher forcing后期逐步降低比例。5. 高斯混合模型与深度强化学习的收尾坑5.1 高斯混合模型的实现选择chap11_gaussian_mixture里只有 README 和少量代码这说明课程更倾向于让学生从参数推导开始写。EM 算法的套路很固定E 步计算每个样本属于各个高斯成分的后验概率M 步更新均值、协方差和混合系数。写 GMM 时先不要用 sklearn亲自动手实现一遍可以帮助理解聚类背后这种概率模型的收敛过程。如果你只想快速验证 GMM 在给定数据上的表现sklearn 的实现可以作为对照标准常见的验证方法是用自己的 EM 实现拟合然后用 BIC 选择高斯成分数量这主要用于判断 clustering 结构存在的可能性。但要注意处理协方差矩阵奇异问题在实现时给协方差矩阵的对角线加一个很小的正则项如1e-6这样np.linalg.det不会变成 0这个细节在做高维数据时也很有意义。5.2 Reversi 游戏与深度强化学习的实际边界chap14_reinforcement_learning这里的实现比前面 CRC 的 RBM 章节多了一些可运行代码。reversi_main.py和RL_QG_agent.py的配合点是主程序维护棋盘状态和回合逻辑agent 在模拟器里与环境交互收集状态转移数据逐步更新策略。这个设计比较接近基础的 Q-learning 或 Deep Q-Network 路线。# 典型 Q-learning 更新伪代码reversi 棋盘状态下使用 learning_rate 0.1 discount 0.95 def q_update(q_table, state, action, reward, next_state, done): best_next np.max(q_table[next_state]) if not done else 0 q_table[state][action] (1 - learning_rate) * q_table[state][action] \ learning_rate * (reward discount * best_next)参数说明learning_rate控制新经验覆盖旧 Q 值的速度太大不稳定太小收敛慢discount是未来奖励的折损Reversi 这类棋盘游戏建议设在 0.9 到 0.99 之间因为对局存在多步延迟奖励。如果用 DQN 而不是 Q-table则需要把q_table换成神经网络并加入经验回放和固定目标网络否则训练会发散。5.3 一个快速验证训练是否正常的技巧把仓库里所有项目跑过一遍后我觉得最值得收藏的调试经验是在 RNN 的训练循环里打印每 100 轮 loss 的变化同时记录生成的字符串是否在往合理方向变化而不是只看 loss 数值变小。模型是否过拟合可以通过测试集 accuracy 判断但序列生成任务中训练 loss 下降不代表模型真学到了语法更有效的方式是看输出样本多样性如果总是生成重复的同一段文字很可能是出现了模式坍塌。这时可以降低采样温度即用logits / temperature再 softmax或减少 embedding 维度比如从 128 改成 64让模型容量不要超出任务所需的范围。对线性和 CNN 部分验证是数值梯度检查对序列模型验证是人工读生成结果对 GMM验证是各类集合的收敛稳定性和数据覆盖度。把这些验证方法串起来正好构成这套课程资源一条完整的自查路径。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。