首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
计算机与人工智能
从简单的预测机开始
分类器与预测器的差别
训练简单的分类器
一个分类器求解问题的局限性
神经元—大自然的计算机器
在神经网络中追踪信号
大有用途的矩阵乘法
使用矩阵乘法的三层神经网络示例
学习来自多个节点的权重
多个输出节点反向传播误差
反向传播误差到更多层中
使用矩阵乘法进行反向传播误差
我们实际上如何更新权重
权重更新成功范例
准备训练数据
使用Python制作神经网络
初始化网络
权重—网络的核心
更加复杂的权重
训练神经的查询网络
完整的代码整理
开始训练任务之训练网络
手写数字的数据集MNIST
准备MNIST训练数据
使用数据集测试网络
使用完整数据集进行训练和测试
一些改进:调整学习率
一些改进:多次运行
改变网络形状
最终代码
实践-自己的手写数字
实践-创建新的训练数据:旋转图像
当前位置:
首页>>
技术小册>>
Python神经网络入门与实践
小册名称:Python神经网络入门与实践
让我们先从构建超级简单的机器开始。 想象一下,一台基本的机器,接受了一个问题,做了一些“思考”,并输出了一个答案。与我们在上面的例子中进行的操作一样,我们从眼睛输入图片,使用大脑分析场景,并得出在场景中有哪些物体的结论。 下面就是这台机器看起来的样子。 ![](/uploads/images/20231213/963e830b79d1c86e22286f6c011b88e0.png) 记住,计算机不是真的思考,它们只是得到包装的计算器,因此让我们使用更恰当的词语来形容这个过程。 ![](/uploads/images/20231213/f6bf88e73d8ea70db883ffd0428e972c.png) 一台计算机接受了一些输入,执行了一些计算,然后弹出输出。下列的内容详细说明了这一点。一台计算机对“3×4”的输入进行处理,这种处理也许是将乘法运算转化为相对简单的一组加法,然后弹出答案“12”。 ![](/uploads/images/20231213/38a8ea8ac7dd20239ad703dae84bca76.png) 你可能会想“这也没什么了不起的吧!”,没关系。这里,我们使用简单和熟悉的例子来引出此后我们将看到的更有趣的神经网络的概念。 让我们稍微增加一点复杂度。 试想一下将千米转化为英里的一台机器,如下所示。 ![](/uploads/images/20231213/927b9f6f94e44e724c30c635bad5f81d.png) 现在想象一下,我们不知道千米和英里之间的转换公式。我们所知道的就是,两者之间的关系是线性的。这意味着,如果英里数加倍,那么表示相同距离的千米数也是加倍的。这是非常直观的。如果这都不是真理,那么这个宇宙就太让人匪夷所思了。 千米和英里之间的这种线性关系,为我们提供了这种神秘计算的线索,即它的形式应该是“英里=千米×C”,其中C为常数。现在,我们还不知道这个常数C是多少。 我们拥有的唯一其他的线索是,一些正确的千米/英里匹配的数值对示例。这些示例就像用来验证科学理论的现实世界观察实验一样,显示了世界的真实情况。 ![](/uploads/images/20231213/5de8e273eebdc28ca4097720a3f8710a.png) 我们应该做些什么,才能计算出缺失的常数C呢?我们信手拈来一个随机的数值,让机器试一试!让我们试着使用C=0.5,看看会发生什么情况。 ![](/uploads/images/20231213/e5026bddf04c8bef0a80e22ef232ca5a.png) 这里,我们令:英里=千米×C,其中千米为100,当前,我们猜测C为0.5。 这台机器得到50英里的答案。 嗯,鉴于我们随机选择了C=0.5,这种表现还算不错。但是,编号为2的真实示例告诉我们,答案应该是62.137,因此我们知道这是不准确的。 我们少了12.137。这是计算结果与我们列出的示例真实值之间的差值,是误差。即: 误差值=真实值-计算值 =62.137-50 =12.137 ![](/uploads/images/20231213/cdfeecd6e9d38eb779b1cf8f14e335fe.png) 下一步,我们将做些什么呢?我们知道错了,并且知道差了多少。我们无需对这种误差感到失望,我们可以使用这个误差,指导我们得到第二个、更好的C的猜测值。 再看看这个误差值。我们少了12.137。由于千米转换为英里的公式是线性的,即英里=千米×C,因此我们知道,增加C就可以增加输出。 让我们将C从0.5稍微增加到0.6,观察会发生什么情况。 现在,由于将C设置为0.6,我们得到了英里=千米×C=100×0.6=60,这个答案比先前50的答案更好。我们取得了明显的进步。 现在,误差值变得更小了,为2.137。这个数值甚至可能是我们很乐于接受的一个误差值。 ![](/uploads/images/20231213/3333882dae8837d070715c59cfb942ed.png) 这里,很重要的一点是,我们使用误差值的大小指导如何改变C的值。我们希望输出值从50增大一些,因此我们稍微增加了C的值。 我们不必尝试使用代数法计算出C需要改变的确切量,让我们继续使用这种方法改进C值。如果你还不能被我说服,还是认为计算出确切的答案才够简单,那么,请记住,更多有趣的问题是没有一个简单的数学公式将输出和输入关联起来的。这就是我们需要诸如神经网络这样相对成熟而复杂的方法的原因。 让我们再次重复这个过程。输出值60还是太小了。我们再次微调C,将其从0.6调到0.7。 ![](/uploads/images/20231213/0088b63a6a87b8cc066f8e6b13f4a6d6.png) 糟糕!过犹不及,结果超过了已知的正确答案。先前的误差值为2.137,现在的误差值为-7.863。这个负号告诉我们,我们不是不足,而是超调了。请记住上面的公式,误差值等于真实值减去计算值。 如此说来,C=0.6比C=0.7好得多。我们可以就此结束这个练习,欣然接受C=0.6带来的小小误差。但是,让我继续向前走一小段距离。我们为什么不使用一个较小的量,微调C,将C从0.6调到0.61呢? ![](/uploads/images/20231213/15e38de43caa04c61ef4577fe3cd1df9.png) 这比先前得到的答案要好得多。我们得到输出值61,比起正确答案62.137,这只差了1.137。 因此,最后的这次尝试告诉我们,应该适度调整C值。如果输出值越来越接近正确答案,即误差值越来越小,那么我们就不要做那么大的调整。使用这种方式,我们就可以避免像先前那样得到超调的结果。 同样,读者无需为如何使用确切的方式算出C值而分心,请继续关注这种持续细化误差值的想法,我们建议将修正值取为误差值的百分比。直觉上,这是正确的:大误差意味着需要大的修正值,小误差意味着我们只需要小小地微调C的值。 无论你是否相信,我们刚刚所做的,就是走马观花地浏览了一遍神经网络中学习的核心过程。我们训练机器,使其输出值越来越接近正确的答案。 这值得读者停下来,思考一下这种方法,我们并未像在学校里求解数学和科学问题时所做的一样一步到位,精确求解问题。相反,我们尝试得到一个答案,并多次改进答案,这是一种非常不同的方法。一些人将这种方法称为迭代,意思是持续地、一点一点地改进答案。 ![](/uploads/images/20231213/70031e2b9186a7c4e34f3aa4efa70c42.png)
上一篇:
计算机与人工智能
下一篇:
分类器与预测器的差别
该分类下的相关小册推荐:
Python爬虫入门与实战开发(下)
Python合辑9-判断和循环
Python甚础Django与爬虫
Python自动化办公实战
剑指Python(磨刀不误砍柴工)
Python数据分析与挖掘实战(下)
Python编程轻松进阶(二)
Python合辑4-130个字符串操作示例
机器学习算法原理与实战
Python合辑5-格式化字符串
剑指Python(万变不离其宗)
Python高并发编程与实战