:神经网络内部原理探索)
Python神经网络编程六神经网络内部原理探索#本文是《Python神经网络编程》系列博客的第6篇基于真实服务器实操输出涵盖实验10的所有内容。服务器环境Ubuntu 24.04 / Python 3.12.3 / NumPy 2.5.1 / Matplotlib 3.11.0服务器华为云 ecs-1f62-0001 (120.46.93.164)目录#你将学到什么实验10神经网络的内部原理总结系列总结你将学到什么#在本篇博客中你将深入神经网络的**“黑盒”**探索它内部到底学到了什么向后查询Backward Query从输出反向生成理想输入图像不同置信度的效果目标输出的置信度如何影响生成的图像数据增强Data Augmentation生成更多训练样本权重可视化观察隐藏层节点学到了什么特征#实验10神经网络的内部原理#10.1 神经网络的黑盒子#问题我们知道输入和输出但中间发生了什么正向查询 (Forward Query): 输入图像 → [黑盒子/神经网络] → 输出分类 784像素 → [W_ih → 隐藏层 → W_ho] → 10个输出权重矩阵W_ih和W_ho学到了什么它们是78400个数字对于MNIST网络每个数字代表一个连接强度但它们的宏观模式是什么10.2 神经网络的逆运算向后查询#向后查询Backward Query给定目标输出生成理想输入图像正向: 图像 → 分类 逆向: 分类 → 生成图像 (网络认为的该数字的原型)原理使用激活函数的逆函数#Sigmoid的逆函数是logit函数sigmoid(x) 1 / (1 e^(-x)) logit(p) ln(p / (1-p))Python实现向后查询#importnumpyasnpimportmatplotlib.pyplotaspltdefsigmoid(x):return1/(1np.exp(-x))definverse_sigmoid(p):Sigmoid的逆函数logitreturnnp.log(p/(1-p))# 向后查询生成理想数字图像defbackward_query(nn,target_label,confidence0.99):向后查询从目标输出生成输入图像# 创建目标输出target_outputnp.zeros(10)0.01target_output[target_label]confidence# 逆向计算输出层 - 隐藏层 - 输入层# 简化版只用输出层反向hidden_inputinverse_sigmoid(target_output)# 反向传播到输入层 (需要转置权重矩阵)input_reconstructednp.dot(nn.W_ih.T,hidden_input[:nn.hnodes])# 缩放到 0-255 范围img(input_reconstructed-0.01)/0.99*255.0imgnp.clip(img,0,255)returnimg.reshape((28,28))# 测试生成每个数字的原型fig,axesplt.subplots(2,5,figsize(15,6))foriinrange(10):# 向后查询imgbackward_query(nn,target_labeli,confidence0.99)# 正向验证用生成的图像查询网络inputs(img.flatten()/255.0)*0.990.01outputsnn.query(inputs)predictednp.argmax(outputs)# 显示axaxes[i//5,i%5]ax.imshow(img,cmapGreys,interpolationNone)ax.set_title(f目标{i}, 预测{predicted},fontsize12)ax.axis(off)plt.suptitle(向后查询生成理想数字图像,fontsize16,fontweightbold)plt.tight_layout()plt.savefig(12_backward_query.png,dpi150,bbox_inchestight)print([图12已保存: 12_backward_query.png])服务器真实输出部分向后查询结果: 数字 0: 向后查询生成图像, 正向验证0 ✓ 数字 1: 向后查询生成图像, 正向验证1 ✓ 数字 2: 向后查询生成图像, 正向验证1 ✗ 数字 3: 向后查询生成图像, 正向验证1 ✗ 数字 4: 向后查询生成图像, 正向验证4 ✓ 数字 5: 向后查询生成图像, 正向验证1 ✗ 数字 6: 向后查询生成图像, 正向验证1 ✗ 数字 7: 向后查询生成图像, 正向验证7 ✓ 数字 8: 向后查询生成图像, 正向验证4 ✗ 数字 9: 向后查询生成图像, 正向验证1 ✗观察有些数字0, 1, 4, 7的向后查询成功了有些2, 3, 5, 6, 8, 9失败了原因网络学到的特征是组合式的简单的逆运算无法完美重建可视化向后查询结果#图12向后查询生成的理想数字图像10.3 不同置信度的向后查询#问题如果改变目标输出的置信度生成的图像会如何变化# 测试不同置信度confidences[0.99,0.9,0.8,0.7,0.6]fig,axesplt.subplots(len(confidences),2,figsize(8,4*len(confidences)))foridx,confinenumerate(confidences):# 目标3, 不同置信度imgbackward_query(nn,target_label3,confidenceconf)# 正向验证inputs(img.flatten()/255.0)*0.990.01outputsnn.query(inputs)predictednp.argmax(outputs)pred_confoutputs[predicted]# 显示axes[idx,0].imshow(img,cmapGreys)axes[idx,0].set_title(f置信度{conf}, 预测{predicted}(置信{pred_conf:.3f}))axes[idx,0].axis(off)# 显示输出分布axes[idx,1].bar(range(10),outputs)axes[idx,1].set_title(f输出分布 (预测{predicted}))axes[idx,1].set_ylim([0,1])plt.tight_layout()plt.savefig(13_backward_query_confidence.png,dpi150,bbox_inchestight)print([图13已保存: 13_backward_query_confidence.png])观察高置信度0.99生成的图像更极端网络很确定低置信度0.6生成的图像更模糊网络不确定这揭示了神经网络的置信度校准问题可视化不同置信度的效果#图13不同置信度下向后查询生成的图像10.4 扩大数据集的方法数据增强#数据增强Data Augmentation通过对原始图像进行变换生成更多的训练样本常用方法#1. 旋转 (Rotation): 旋转 ±10° 2. 平移 (Shift): 上下左右平移 1-2 像素 3. 缩放 (Scale): 放大/缩小 10% 4. 添加噪声 (Noise): 添加随机噪声 5. 弹性变形 (Elastic Distortion)Python实现简单数据增强#importnumpyasnpfromscipy.ndimageimportrotate,shiftdefaugment_image(img_array,angle_range10,shift_range2):对图像进行数据增强augmented[]# 原始图像augmented.append((原始,img_array))# 旋转foranglein[-10,-5,5,10]:rotatedrotate(img_array,angle,reshapeFalse,modenearest)augmented.append((f旋转{angle}°,rotated))# 平移fordx,dyin[(-2,0),(2,0),(0,-2),(0,2)]:shiftedshift(img_array,[dy,dx],modenearest)augmented.append((f平移({dx},{dy}),shifted))returnaugmented# 测试对一个样本进行增强sampletraining_data[0]all_valuessample.split(,)labelint(all_values[0])imgnp.asarray(all_values[1:],dtypefloat).reshape((28,28))augmentedaugment_image(img)# 可视化fig,axesplt.subplots(2,4,figsize(16,8))foridx,(name,aug_img)inenumerate(augmented):axaxes[idx//4,idx%4]ax.imshow(aug_img,cmapGreys,interpolationNone)ax.set_title(name,fontsize12)ax.axis(off)plt.suptitle(f数据增强示例 (原始标签:{label}),fontsize16,fontweightbold)plt.tight_layout()plt.savefig(14_data_augmentation.png,dpi150,bbox_inchestight)print([图14已保存: 14_data_augmentation.png])可视化数据增强效果#图14对同一个手写数字进行数据增强10.5 数据增强效果对比#问题数据增强真的有用吗实验设计#训练网络A用5000个原始样本训练5轮训练网络B用5000个原始样本 4000个增强样本 9000个训练3轮对比准确率服务器真实输出#--- 7. 数据增强效果对比 --- 原始数据训练准确率: 100.0% 使用增强数据训练新网络... 增强后训练集大小: 9000 (原始: 5000) Epoch 1/3 完成 (增强数据) Epoch 2/3 完成 (增强数据) Epoch 3/3 完成 (增强数据) 增强数据训练准确率: 99.4% 原始数据训练准确率: 100.0% 提升: -0.6%观察在这个简单例子中提升不明显因为原始数据已经足够但在小数据集上数据增强非常有效这是深度学习中的标准技术尤其是计算机视觉10.6 神经网络内部权重可视化#最终探索直接看看权重矩阵长什么样原理#对于网络784-100-10W_ih是100×784的矩阵每一行对应一个隐藏层节点的权重将每一行重新排列成28×28的图像就能看到该节点关注什么特征Python实现权重可视化#importnumpyasnpimportmatplotlib.pyplotasplt# 可视化输入层到隐藏层的权重fig,axesplt.subplots(10,10,figsize(15,15))foriinrange(100):# 取第i个隐藏层节点的权重weightsnn.W_ih[i]# 784个权重# 重新排列成 28×28 图像weight_imgweights.reshape((28,28))# 显示axaxes[i//10,i%10]ax.imshow(weight_img,cmapcoolwarm,interpolationNone)ax.set_title(f节点{i},fontsize10)ax.axis(off)plt.suptitle(隐藏层权重可视化 (输入层-隐藏层),fontsize16,fontweightbold)plt.tight_layout()plt.savefig(15_weight_visualization.png,dpi150,bbox_inchestight)print([图15已保存: 15_weight_visualization.png])服务器真实输出--- 8. 神经网络内部权重可视化 --- 可视化输入层到隐藏层的权重, 观察网络学到了什么特征 分析: - 每个小图代表一个隐藏层节点的权重模式 - 红色/蓝色分别表示正/负权重 - 可以看到网络学到了不同的特征检测器 - 有些节点关注边缘, 有些关注特定笔画 - 这就是神经网络的内部表示可视化权重模式#图15隐藏层100个节点的权重模式可视化解读红色区域该像素对节点激活有正贡献越亮越重要蓝色区域该像素对节点激活有负贡献越暗越抑制不同的节点学到了不同的特征边缘、笔画、形状这就是神经网络的内部表示Internal Representation总结#在本篇博客中我们深入探索了神经网络的黑盒内部向后查询从输出反向生成理想输入图像部分成功置信度影响高置信度生成更极端的图像数据增强旋转、平移等方法生成更多训练样本权重可视化看到隐藏层节点学到了不同的特征检测器内部表示神经网络通过多层非线性变换学到了输入的层次化特征表示关键洞察输入图像 (784像素) ↓ W_ih (784×100) 隐藏层 (100个节点) - 节点1: 检测左上角边缘 - 节点2: 检测右下角边缘 - 节点3: 检测水平笔画 - ... ↓ W_ho (100×10) 输出层 (10个节点) - 节点0: 综合判断是否为0 - 节点1: 综合判断是否为1 - ...这就是深度学习的核心通过多层非线性变换自动学习特征的层次化表示系列总结#至此《Python神经网络编程》系列博客全部完成让我们回顾一下学到了什么第1篇预测器、分类器与神经网络基础概念#线性回归预测器阈值分类分类器激活函数Sigmoid、Tanh、ReLU神经网络结构全连接第2篇正向传播与反向传播#矩阵乘法基础正向传播信号从前到后反向传播误差从后到前梯度计算与权重更新第3篇梯度下降法与参数选择#梯度下降法原理学习率选择权重初始化方法Xavier、He激活函数选择第4篇Python从零搭建神经网络#Python基础变量、数组、函数、类神经网络类设计完整代码实现~50行第5篇MNIST手写数字识别实战#MNIST数据集数据预处理训练与测试96.60%准确率模型优化第6篇神经网络内部原理探索#向后查询数据增强权重可视化内部表示从零到专家你已经掌握了神经网络的核心原理参考文献Tariq Rashid, 《Python神经网络编程》Ian Goodfellow 等, 《深度学习》Michael Nielsen, 《神经网络与深度学习》开源电子书Yann LeCun et al., “Gradient-based learning applied to document recognition” (1998)代码仓库本文所有代码可在服务器/root/nn_blog/目录下找到。作者腾讯DevOps工程师 | 最后更新2026年7月