python之感知器-从零开始学深度学习
感知器-从零开始学深度学习
未来将是人工智能和大数据的时代,是各行各业使用人工智能在云上处理大数据的时代,深度学习将是新时代的一大利器,在此我将从零开始记录深度学习的学习历程。
我希望在学习过程中做到以下几点:
- 了解各种神经网络设计原理。
- 掌握各种深度学习算法的python编程实现。
- 运用深度学习解决实际问题。
让我们开始踏上深度度学习的征程。
一、感知器原型
想要了解“神经网络”,我们需要了解一种叫做“感知器”的⼈⼯神经元。感知器在 20 世纪五、六⼗年代由科学家 Frank Rosenblatt 发明,⼀个感知器接受⼏个输⼊,并产⽣⼀个输出。
下图是一个感知器:
⽰例中的感知器有三个输⼊x1、x2、x3(1*w0作为偏置,后面会讲到)。通常可以有更多或更少输⼊。 Rosenblatt 提议⼀个简单的规则来计算输出。他引⼊权重w1、w2、w3..表⽰相应输⼊对于输出重要性的实数(权重)。神经元的输出为0 或者 1,则由计算权重后的总和 ∑jwjxj∑jwjxj
⼩于或者⼤于⼀些阈值决定。和权重⼀样,
阈值是⼀个实数,⼀个神经元的参数。⽤更精确的代数形式:
这就是⼀个感知器所要做的所有事情!
而我们把阖值移动到不等式左边,并用感知器的偏置b=-threshold代替,用偏置而不用阖值。其中实现偏置的一种方法就是如前图所示在输入中引入一个偏置神经元x0=1,则b=x0*w0,那么感知器的规则可以重写为:
此时就可以使用阶跃函数来作为感知器的激励函数。
到此我们可以发现,一个感知器由以下几部分组成
接下去我们将会用一个例子来理解感知器的模型。
模型的建立是运用深度学习方法解决问题的基础。
二、感知器的运用
1、感知器实现逻辑运算
我们设计一个感知器,让它来实现and运算。程序员都知道,and是一个二元函数(带有两个参数和),下面是它的真值表:
x1x1 | x2x2 | yy |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
为了计算方便,我们用0表示false,用1表示true。
可以看到感知器本身是一个线性分类器,它通过求考虑了权重的各输入之和与阖值的大小关系,对事物进行分类。
所以任何线性分类或线性回归问题都可以用感知器来解决。前面的布尔运算可以看作是二分类问题,即给定一个输入,输出0(属于分类0)或1(属于分类1)。
如下面所示,and运算是一个线性分类问题,即可以用一条直线把分类0(false,红叉表示)和分类1(true,绿点表示)分开。
然而,感知器却不能实现异或运算,如下图所示,异或运算不是线性的,你无法用一条直线把分类0和分类1分开。
2、感知器的训练
三、python实现感知器
- class Perceptron(object):
- def __init__(self, input_num, activator):
- '''
- 初始化感知器,设置输入参数的个数,以及激活函数。
- 激活函数的类型为double -> double
- '''
- self.activator = activator
- # 权重向量初始化为0
- self.weights = [0.0 for _ in range(input_num)]
- # 偏置项初始化为0
- self.bias = 0.0
- def __str__(self):
- '''
- 打印学习到的权重、偏置项
- '''
- return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
- def predict(self, input_vec):
- '''
- 输入向量,输出感知器的计算结果
- '''
- # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起
- # 变成[(x1,w1),(x2,w2),(x3,w3),...]
- # 然后利用map函数计算[x1*w1, x2*w2, x3*w3]
- # 最后利用reduce求和
- return self.activator(
- reduce(lambda a, b: a + b,
- map(lambda (x, w): x * w,
- zip(input_vec, self.weights))
- , 0.0) + self.bias)
- def train(self, input_vecs, labels, iteration, rate):
- '''
- 输入训练数据:一组向量、与每个向量对应的label;以及训练轮数、学习率
- '''
- for i in range(iteration):
- self._one_iteration(input_vecs, labels, rate)
- def _one_iteration(self, input_vecs, labels, rate):
- '''
- 一次迭代,把所有的训练数据过一遍
- '''
- # 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]
- # 而每个训练样本是(input_vec, label)
- samples = zip(input_vecs, labels)
- # 对每个样本,按照感知器规则更新权重
- for (input_vec, label) in samples:
- # 计算感知器在当前权重下的输出
- output = self.predict(input_vec)
- # 更新权重
- self._update_weights(input_vec, output, label, rate)
- def _update_weights(self, input_vec, output, label, rate):
- '''
- 按照感知器规则更新权重
- '''
- # 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起
- # 变成[(x1,w1),(x2,w2),(x3,w3),...]
- # 然后利用感知器规则更新权重
- delta = label - output
- self.weights = map(
- lambda (x, w): w + rate * delta * x,
- zip(input_vec, self.weights))
- # 更新bias
- self.bias += rate * delta
- def f(x):
- '''
- 定义激活函数f
- '''
- return 1 if x > 0 else 0
- def get_training_dataset():
- '''
- 基于and真值表构建训练数据
- '''
- # 构建训练数据
- # 输入向量列表
- input_vecs = [[1,1], [0,0], [1,0], [0,1]]
- # 期望的输出列表,注意要与输入一一对应
- # [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0
- labels = [1, 0, 0, 0]
- return input_vecs, labels
- def train_and_perceptron():
- '''
- 使用and真值表训练感知器
- '''
- # 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为f
- p = Perceptron(2, f)
- # 训练,迭代10轮, 学习速率为0.1
- input_vecs, labels = get_training_dataset()
- p.train(input_vecs, labels, 10, 0.1)
- #返回训练好的感知器
- return p
- if __name__ == '__main__':
- # 训练and感知器
- and_perception = train_and_perceptron()
- # 打印训练获得的权重
- print and_perception
- # 测试
- print '1 and 1 = %d' % and_perception.predict([1, 1])
- print '0 and 0 = %d' % and_perception.predict([0, 0])
- print '1 and 0 = %d' % and_perception.predict([1, 0])
- print '0 and 1 = %d' % and_perception.predict([0, 1])
python之感知器-从零开始学深度学习的更多相关文章
- 从零开始学深度学习mxnet教程:安装以及基本操作
一.导言 本教程适合对人工智能有一定的了解的同学,特别是对实际使⽤深度学习感兴趣的⼤学⽣.⼯程师和研究⼈员.但本教程并不要求你有任何深度学习或者机器学习的背景知识,我们将从头开始解释每⼀个概念.虽然深 ...
- 小白学习之pytorch框架(2)-动手学深度学习(begin-random.shuffle()、torch.index_select()、nn.Module、nn.Sequential())
在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比 ...
- 用Python实现随机森林算法,深度学习
用Python实现随机森林算法,深度学习 拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩 ...
- 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF
随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...
- 【动手学深度学习】Jupyter notebook中 import mxnet出错
问题描述 打开d2l-zh目录,使用jupyter notebook打开文件运行,import mxnet 出现无法导入mxnet模块的问题, 但是命令行运行是可以导入mxnet模块的. 原因: 激活 ...
- Python、机器学习、计算机视觉、深度学习入门
1.简明Python教程 2.Python计算机视觉编程 3.机器学习实践 4.吴恩达机器学习 5.李飞飞深度学习与计算机视觉
- python机器学习——感知器
最近在看机器学习相关的书籍,顺便把每天阅读的部分写出来和大家分享,共同学习探讨一起进步!作为机器学习的第一篇博客,我准备从感知器开始,之后会慢慢更新其他内容. 在实现感知器算法前,我们需要先了解一下神 ...
- 动手学深度学习14- pytorch Dropout 实现与原理
方法 从零开始实现 定义模型参数 网络 评估函数 优化方法 定义损失函数 数据提取与训练评估 pytorch简洁实现 小结 针对深度学习中的过拟合问题,通常使用丢弃法(dropout),丢弃法有很多的 ...
- Python实现感知器的逻辑电路(与门、与非门、或门、异或门)
在神经网络入门回顾(感知器.多层感知器)中整理了关于感知器和多层感知器的理论,这里实现关于与门.与非门.或门.异或门的代码,以便对感知器有更好的感觉. 此外,我们使用 pytest 框架进行测试. p ...
随机推荐
- 报错:require_once cannot allocate memory----php,以前自己弄的稍微有点特殊的开发环境
最近出现过一个问题,值得记录 类似于这样的报错的问题: Warning: require_once(/www/app/somecomponent.php): failed to open stream ...
- java学习(第四篇)数组
一.一维数组 1.声明,分配内存 int[] a=new int[10]; 数组元素的数据类型 [] 数组名=new 类型 [数组元素个数]: 2.初始化 int[] a=new int[] {1,2 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业
<Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...
- [Inno Setup] 如何读取命令行输入的参数
以 /verysilent 为例 [Code] var isVerySilent: Boolean; function InitializeSetup(): Boolean; var j: Integ ...
- SpringBoot应用操作Rabbitmq(direct高级操作)
一.首先声明完成任务架构,通过direct订阅/发布的模式进行生产消费. a.消息生产指定交换器和路由key b.消费者绑定交换器,路由key和队列的关系(集群监控收到的消息不重复) 二.实战演练 1 ...
- 理解async/await
async 和 await 在干什么 任意一个名称都是有意义的,先从字面意思来理解.async 是“异步”的简写,而 await 可以认为是 async wait 的简写.所以应该很好理解 async ...
- javascript SDK开发之webpack打包支持对象展开运算符...
场景:使用了对象的展开运算符,webpack打包报错,错误如下:Parsing error: Unexpected token - 1.安装依赖 npm install babel-preset-st ...
- mac OS 安装 Homebrew软件包管理器
Homebrew macOS 缺失的软件包的管理器 中文官网 https://brew.sh/index_zh-cn 获取安装命令 /usr/bin/ruby -e "$(curl -fsS ...
- [故障解决]图文:windows apache无法启用 端口被占用
windows apache无法启用 端口被占用 1 XAMPP Error: Apache shutdown unexpectedly 无法启动apache,显示的log为: 2 查了一下端口, 通 ...
- vim的四种工作模式(转载别人的)
Vim操作的四种模式 Vim的四种模式一.启动Vim1.双击桌面的图标,就可以启动Vim(是图形界面的)2.在开始菜单---点--运行 接着输入 vim 或者gvim,就可以启动Vim或Gvim了.二 ...