【图文解说】BP神经网络与深度学习CNN的关系

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/

BP神经网络是一个经典、有效的算法,即使时至今日,在传统的"小数据"领域仍有卓越的拟合效果。而BP神经网络的更大贡献是,它开启了后来的CNN\RNN等深度学习模型的大门。本文简单讲解BP神经网络是与深度学习CNN的关系。

一、BP神经网络网络是什么

BP神经网络模仿人的大脑,将输入层层前馈并激活,从而得到最终的输出,BP神经网络的拓扑结构如下:
BP神经网络模拓扑结构
BP更多用于数值拟合,这时最常用的是三层BP神经网络,三层的BP神经网络只要隐节点足够多就足以拟合任意曲线。
BP神经网络原理

二、BP神经网络用于图象识别问题

1.1.BP神经网络解决图象识别问题

由于BP神经网络可以拟合任意曲线,因此搭配softmax函数,进一步解决模式识别问题,包括图像的识别,例如“手写数字识别”。
手写数字识别问题
手写数字是28×28的黑白图片,将它展平后就是28×28=784的输入,再投入到三层BP神经网络中进行训练,最终用于预测图片属于0-9各个数字的概率。通过一个简单的训练,就可以得到97.6%的识别准确率:
在这里插入图片描述
详细代码与训练过程可参考:《BP神经网络识别手写数字》

1.2.BP神经网络解决图象识别问题的困难

在上述手写字识别的图象识别问题中,BP神经网络是毫无压力的,但如果企图用于更大的图片,会面临参数爆炸的问题。例如224×224=50176的图片,那么就有5W个输入,进一步地,网络的隐节点即使只有1W,也会有5亿个隐层权重,这将给求解带来极大的困难。
BP神经网络的参数灾难

三、从BP到CNN深度学习模型

由于BP神经网络在图片识别上有参数维度灾难,那么最简单的就是减少输入的个数就可以了!是的,直接把224×224的图片,压缩成24×24的图片不就可以了吗?!
CNN的思想
事实上,CNN就是这么做的,但它采用了更加智能的压缩方法–加入了卷积层与池化层来自动压缩图片。一个卷积层的示例如下,通过卷积核,可以将输入内容进行整合、压缩。
在这里插入图片描述
一个卷积神经网络CNN的基本结构如下:
CNN神经网络结构
CNN通过C(卷积层)与P(池化层),逐步将图片进行压缩,使得图片的Size缩小,小到一定程度时,再投入三层的BP神经网络中(F6,F7)中拟合输出就可以了。
备注:由于卷积层是稀疏连接,BP则是全连接,所以CNN中一般以F(Full Connect)层来指代BP。
使用pytorch实现一个卷积神经网络,用于数字识别,简简单单就能得到99.8%的准确率,可见CNN的效果要比BP要好得多。
在这里插入图片描述
从上可以看到,随着卷积与池化的加入,网络的层数就加深了,在后来,层数越来越深,也就有了深度学习一说。


相关链接:

《老饼讲解-机器学习》:老饼讲解-机器学习教程-通俗易懂
《老饼讲解-神经网络》:老饼讲解-matlab神经网络-通俗易懂
《老饼讲解-神经网络》:老饼讲解-深度学习-通俗易懂

### 关于BP神经网络图文作业学习资料 BP神经网络是一种经典的监督学习算法,广泛应用于模式识别、分类预测等领域。其核心思想是通过误差反向传播调整权重参数,从而优化模型性能[^1]。 #### BP神经网络的核心概念 BP神经网络主要由输入层、隐藏层和输出层组成。每一层中的节点都其他层相连,并通过激活函数传递信号。在训练过程中,利用梯度下降法不断调整连接权值 \( w \),使得实际输出尽可能接近目标输出[^3]。 以下是几个推荐的学习资源: --- #### 推荐学习资料 1. **《BP神经网络原理实现》** 这是一篇详细介绍BP神经网络基本原理的文章,涵盖了理论基础以及其实现方法。适合初学者快速掌握BP神经网络的工作机制[^2]。 2. **《BP神经网络详解 图文版》** 提供了丰富的图表说明BP神经网络的结构及其工作流程,帮助读者更直观地理解前馈过程和误差反向传播的过程。 3. **在线课程:老饼系列教程** 老饼制作了一系列关于BP神经网络的教学视频,包括但不限于LVQ、RBF等相关主题。这些内容不仅深入浅出,还提供了大量实践案例。 4. **头歌教育平台上的练习项目** 头歌平台上有关于BP神经网络的实际编程作业,通常会涉及以下几个方面: - 使用Python编写简单的BP神经网络; - 实践基于MNIST手写数字数据集的分类任务; - 应用TensorFlow或PyTorch框架完成复杂场景下的建模。 下面提供一段简单的BP神经网络代码示例,用于演示如何构建并训练一个两层全连接网络: ```python import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.W1 = np.random.randn(input_size, hidden_size) self.b1 = np.zeros(hidden_size) self.W2 = np.random.randn(hidden_size, output_size) self.b2 = np.zeros(output_size) def forward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 y_pred = sigmoid(self.z2) return y_pred def backward(self, X, y, learning_rate=0.1): m = X.shape[0] delta2 = (y_pred - y) * y_pred * (1 - y_pred) dW2 = np.dot(self.a1.T, delta2) / m db2 = np.sum(delta2, axis=0) / m delta1 = np.dot(delta2, self.W2.T) * self.a1 * (1 - self.a1) dW1 = np.dot(X.T, delta1) / m db1 = np.sum(delta1, axis=0) / m # 更新参数 self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 # 测试代码 X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y_train = np.array([0, 1, 1, 0]) nn = NeuralNetwork(2, 2, 1) for i in range(10000): y_pred = nn.forward(X_train) loss = np.mean((y_pred - y_train)**2) if i % 1000 == 0: print(f"Iteration {i}, Loss: {loss}") nn.backward(X_train, y_train) ``` 上述代码展示了如何定义一个具有两个隐含层单元的小型BP神经网络,并对其进行训练以解决异或问题[XOR]^[]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老饼讲解-BP神经网络

请老饼喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值