深度学习基础-基于Numpy的感知机Perception构建和训练
1. 感知机模型
感知机Perception是一个线性的分类器,其只适用于线性可分的数据。
f(x) = sign(w.x + b)
其试图在所有线性可分超平面构成的假设空间中找到一个能使训练集中的数据可分的超平面。
因此,它找到的并不一定是最优的,即只是恰好拟合了训练数据的超平面。
2. 学习
感知机的学习策略为:最小化误分类点到超平面的距离。
3. 基于numpy的感知机实现
1 # coding: utf-8
2 import numpy as np
3
4
5 def prepare_data(n=100):
6 # Fitting OR gate
7 def OR(x):
8 w = np.array([0.5, 0.5])
9 b = -0.2
10 tmp = np.sum(w*x) + b
11 if tmp <= 0:
12 return 0
13 else:
14 return 1
15
16 inputs = np.random.randn(n, input_size)
17 labels = np.array([OR(inputs[i]) for i in range(n)])
18 return inputs, labels
19
20
21 class Perception:
22 def __init__(self, input_size, lr=0.001):
23 # 初始化权重和偏置
24 self.w = np.random.randn(input_size)
25 self.b = np.random.randn(1)
26 self.lr = np.array(lr)
27
28 def predict(self, x):
29 tmp = np.sum(self.w*x) + self.b
30 if tmp <= 0:
31 return -1
32 else:
33 return 1
34
35 def update(self, x, y):
36 # 基于SGD的参数更新(由最小化误分类点到超平面的距离求导可得)
37 self.w = self.w + self.lr*y*x
38 self.b = self.b + self.lr*y
39
40
41 n = 1000 # 训练样本数
42 ratio = 0.8 # 训练测试比
43 input_size = 2
44
45 print("Preparing Data {}".format(n))
46 X, Y = prepare_data(n)
47 clip_num = int(n * ratio)
48 train_X, train_Y = X[:clip_num], Y[:clip_num]
49 test_X, test_Y = X[clip_num:], Y[clip_num:]
50
51 # Init model
52 lr = 0.005
53 model = Perception(input_size, lr)
54 s = model.predict(X[0])
55 print("Input: ({}, {}), Output: {}".format(X[0][0], X[0][1], s))
56
57 # Training
58 epoches = 100
59 for i in range(epoches):
60 loss = 0
61 wrong_index = []
62 print("\nEpoch {}".format(i+1))
63 print("Forward Computing")
64 for idx in range(clip_num):
65 pred_y = model.predict(train_X[idx])
66 if pred_y != train_Y[idx]:
67 wrong_index.append(idx)
68 tmp_loss = abs(float(np.sum(model.w*train_X[idx]) + model.b))
69 loss += tmp_loss
70
71 print("Wrong predict samples: {}, Loss: {}".format(len(wrong_index), loss))
72 print("Learning")
73 for j in wrong_index:
74 model.update(train_X[j], train_Y[j])
75
76
77 # Testing
78 wrong_num = 0
79 test_loss = 0
80 for j in range(test_X.shape[0]):
81 pred_y = model.predict(test_X[j])
82 if pred_y != test_Y[j]:
83 tmp_loss = abs(float(np.sum(model.w*test_X[j]) + model.b))
84 test_loss += tmp_loss
85 wrong_num += 1
86 print("\nTest wrong predict samples: {}, Loss: {}".format(wrong_num , test_loss))
4. 感知机的延伸
感知机Perception是线性模型,它不能学习非线性函数,因而它对线性不可分的数据束手无力。
例如,感知机可以拟合与门(AND)、或门(OR)、非门(NOT)产生的数据,但是不能处理好异或门(XOR)产生的数据。
基于感知机,可以延伸出LR、 SVM。此外,值得注意的是,虽然单个感知机的表达能力有限,但是如果将多个感知机叠加起来,则可以具备足够
强的表达能力,即 Multi-layer Perception(MLP)的通用近似定理(给定足够多的数据和足够宽的两层MLP,可以近似任意连续函数)。
在《深度学习入门:基于Python的理论与实现》书中有一个直观的例子。假设用三个Perception分别拟合与门、非门和或门,再基于数字电路的知识将这三个门组合起来,即可以构成异或门。

深度学习基础-基于Numpy的感知机Perception构建和训练的更多相关文章
- 深度学习基础-基于Numpy的多层前馈神经网络(FFN)的构建和反向传播训练
本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及花书的读书笔记.本文将以多分类任务为例,介绍多层的前馈神经网络(Feed Forward Networks,FFN)加上 ...
- 深度学习基础-基于Numpy的卷积神经网络(CNN)实现
本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及动手学深度学习的读书笔记.本文将介绍基于Numpy的卷积神经网络(Convolutional Networks,CNN) ...
- [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2
之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...
- 算法工程师<深度学习基础>
<深度学习基础> 卷积神经网络,循环神经网络,LSTM与GRU,梯度消失与梯度爆炸,激活函数,防止过拟合的方法,dropout,batch normalization,各类经典的网络结构, ...
- AI炼丹 - 深度学习必备库 numpy
目录 深度学习必备库 - Numpy 1. 基础数据结构ndarray数组 1.1 为什么引入ndarray数组 1.2 如何创建ndarray数组 1.3 ndarray 数组的基本运算 1.4 n ...
- 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了
Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...
- 深度学习基础系列(五)| 深入理解交叉熵函数及其在tensorflow和keras中的实现
在统计学中,损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数.假设某样本的实际输出为a,而预计的输出为y,则y与a之间存在偏差,深度学习的目的即是通过不断地 ...
- TensorFlow深度学习基础与应用实战高清视频教程
TensorFlow深度学习基础与应用实战高清视频教程,适合Python C++ C#视觉应用开发者,基于TensorFlow深度学习框架,讲解TensorFlow基础.图像分类.目标检测训练与测试以 ...
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
百度为何开源深度机器学习平台? 有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举. 5月20日,百度在github上开源了其 ...
随机推荐
- JS获取Cookie失败
项目开发日记-bug多多篇(1) 在做评论功能的时候遇到了一个很无厘头的错误,我的思路是参照点赞功能,用Ajax技术异步完成评论信息的传输,然后展示在页面上. 那么在提交评论信息的同时,要连着用户名, ...
- 如何设计一个良好的API接口?
沟通创造价值,分享带来快乐.这里是程序员阅读时间,每天和你分享读书心得,欢迎您每天和我一起精进.今天和大家一起讨论的话题是如何设计一个良好的API接口? 作者:梁桂钊 解读:张飞洪 挑战 API是软件 ...
- OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 刘鑫 容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法.在 ArkUI 开发框 ...
- Jqgrid 动态设置cell disabled
$($(grid2.jqGrid("getGridRowById", i + 1))[0].children).each(function (childI, childO) { i ...
- [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算
[源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 目录 [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 0x1. 运行 ...
- [题解][YZOJ50104] 密码 | 简单计数
同步发表于 Mina! 题目大意 对于满足以下要求的长度为 \(n\) 的序列进行计数: 序列的值域为 \([1,k]\); 对于序列的任意位置 \(p\in[1,n]\),可以找到至少一个 \(i\ ...
- 【python疫情可视化】用pyecharts开发全国疫情动态地图,效果酷炫!
一.效果演示 我用python开发了一个动态疫情地图,首先看下效果: 如图所示,地图根据实时数据通过时间线轮播的方式,动态展示数据的变化.随着时间的推移,疫情确诊数量的增多,地图各个省份颜色逐渐加深, ...
- 一、深入学习c++先要练好的内功
掌握进程虚拟地址空间区域的划分 课程讲的内容建立在x86 32位的Linux系统下. 任何的编程语言会产生两种东西:指令和数据.磁盘上的可执行文件在启动时都会加载到内存当中,但是不会加载到物理内存中, ...
- 一起看 I/O | Flutter 休闲游戏工具包发布
作者 / Zoey Fan, Product Manager for Flutter, Google 对于大多数开发者来说,Flutter 是一个应用框架.但利用 Flutter 提供的硬件加速图形支 ...
- 56. Merge Intervals - LeetCode
Question 56. Merge Intervals Solution 题目大意: 一个坐标轴,给你n个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个 ...