ApacheCN_深度学习_感知器

article/2025/11/7 8:48:26

写在前面

1.关于深度学习。目前自己的水平是项目需求在Ubuntu 中搭建Keras,完成了图像的分类使用基础的VGG16,CFAR,ResNet,得到的效果是很惊人的,相对于常规的算法,优势很明显

2.关于ApacheCN。一帮有热情的年轻人组织的知识交流社区,很多人入门都是从这里开始的,安利一下组织的大门ApacheCN

3.关于参与组织活动。严格自律,时间安排更加合理,抱紧组织大腿。

废话不多说,开怼。


深度学习

我记得有这样一道面试题,用最快的时间给你的家人解释什么是深度学习?看着简答说着难,个人想法是说清楚深度学习的几个要素。

1.举个例子。让机器从经验中学习,就像堆积木,不同的层数构建,通过让电脑学习人的神经元传递方式,去完成层次很多的知识,就是一种深度学习;

2.深度学习是机器学习的子集;

3.深度学习是学的很深,学到不是原来的知识形状。


感知器 or 感知机

刚刚拿到这个词,我想到的是感知机是不是一个概念。。。

西瓜书对感知机的定义是由两层神经元组成,输入层接收外界输入信息后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”。

感知器是就是单个的神经元。一个感知器由3部分组成输入权值,激活函数,输出三部分组成。所以两者在描述的就是这样的结构。百度百科也表示这就是一个概念。感知器也是人工神经网络的第一个里程碑,它的核心功能是做决策的,一个感知机其实是对神经元的最基本概念模拟。

比如说你要决定今天出不出去看电影,你要考虑3个因素,一个是女朋友在不在,一个是电影好不好看,另一个是今天有没有工作,这三个因素每个人的权重都不同,有的人看重女朋友,有的人看重工作,所以权重就不等, 最后每个人根据自己的权重做出0或1,去或不去,to be or not to be的决策。那么你怎么做呢?你把三个要素按照它们需要的权重加和在一起, 在把这个分数送到一个叫sigmoid的门面前得到去或不去的决定, 工作原理如上图。

比单层感知机更复杂的多层感知机-或者我们常说的深度网络,是进行数据处理和模式识别的利器。 深度神经网络之所以能够处理这些数据类型,主要是因为这些数据本身具有的复杂结构很适合被NN识别,而人类不需要预先设计识别这些结构的函数而是任由网络学习, D-CNN 深度卷积网络能够同时看到一个图像从细节到抽象的结构,所以能够抓住一些我们人类都说不出的细节。


感知机的作用

在蓝皮书上,感知机是根据输入示例的特征向量x对其进行二分类的线性分类模型:

    

感知机模对应输入空间中的分离超平面w·x+b=0

感知机的学习的策略是极小化损失函数:


损失函数对应于误分类点到分离超平面的总距离。

感知机学习算法实际图随机梯度下降的对损失函数最优化算法,有原始形式和对偶形式。算法比较容易实现。

1.首先任意选取一个超平面

2.用梯度下降法不断极小化目标函数,随机选一个误分类点使其梯度下降


感知器的作用

从最基础的说起,感知器是一个'Yes' or 'No'的工具,可以用来拟合任意线性函数,这样就可以用来处理分类和回归问题。但是感知器不能实现异或的功能。核心是记住在目标平面的权重项w和便置项b的迭代规则


wi是与输入xi对应的权重项,b是偏置项。事实上,可以b看作是值永远为1的输入xb所对应的权重。t是训练样本的实际值,一般称之为label。而y是感知器的输出值,也就是感知器觉得是对的值,它是根据公式(1)计算得出。eta是一个称为学习速率的常数,其作用是控制每一步调整权的幅度。
每次从训练数据中取出一个样本的输入向量x,使用感知器计算其对应y,再根据上面的规则来调整权重。每处理一个样本就调整一次权重。经过多轮迭代后,就可以训练出感知器的权重,使之实现目标函数。

实现代码

代码来自hatemath大佬,博客很优秀,代码很优秀,以下部分为大佬的代码内容自己实现了一遍,很清爽。hatemath

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 23 15:36:21 2018@author: EWilsen
"""
#coding=utf-8from functools import reduce  # for py3class Perceptron(object):def __init__(self, input_num, activator):'''初始化感知器,设置输入参数的个数,以及激活函数。激活函数的类型为double -> double'''self.activator = activator# 权重向量初始化为0self.weights = [0.0 for _ in range(input_num)]# 偏置项初始化为0self.bias = 0.0def __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求和#list1 = list(self.weights)#print ("predict self.weights:", list1)return self.activator(reduce(lambda a, b: a + b,list(map(lambda tp: tp[0] * tp[1],   # HateMath修改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 - outputself.weights = list(map( lambda tp: tp[1] + rate * delta * tp[0], zip(input_vec, self.weights)) ) # HateMath修改# 更新biasself.bias += rate * deltaprint("_update_weights() -------------")print("label - output = delta:" ,label, output, delta)print("weights ", self.weights)print("bias", self.bias)def f(x):'''定义激活函数f'''return 1 if x > 0 else 0def 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] -> 0labels = [1, 0, 0, 0]return input_vecs, labels def train_and_perceptron():'''使用and真值表训练感知器'''# 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为fp = Perceptron(2, f)# 训练,迭代10轮, 学习速率为0.1input_vecs, labels = get_training_dataset()p.train(input_vecs, labels, 10, 0.1)#返回训练好的感知器return pif __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]))

从py2改成py3的调试经过:

1. lambda表达式的使用

第38和第70行中,原适用于Python2.7的代码无法正常运行,提示 invalid syntax。貌似是Python3中,在lambda表达式中使用元组的方式和Python2.7不一样。

我改了一下代码,语法问题没有了,可是预测结果不正常。于是就打印map()函数的返回值,试图调试。

 

2. 打印map()函数返回的对象

参见 https://www.cnblogs.com/lyy-totoro/p/7018597.html 的代码,先转为list再打印。

 list1 = list(data)

print(list1)

 打印输出表明,训练的值明显不对,到底是哪里的问题?

 

3. 真相【小】白

https://segmentfault.com/a/1190000000322433

关键句:在Python3中,如果不在map函数前加上list,lambda函数根本就不会执行。

于是加上list,就变成了最终的代码,工作正常。

只是“lambda函数根本就不会执行”这句,我没考证过,所以说真相小白。








http://chatgpt.dhexx.cn/article/BXsWxPcm.shtml

相关文章

【转载保存】推荐ApacheCN开源的一个机器学习路线图

转载:https://mp.weixin.qq.com/s/EMWFFPsaKaGc8FO1g-htzg 推荐ApacheCN开源的一个机器学习路线图 原创: 机器学习初学者 机器学习初学者 今天 推荐一个ApacheCN开源的一个机器学习路线图: https://github.com/apachecn/AiLearning 注意…

Python关键字(保留字)一览表

保留字是 Python 语言中一些已经被赋予特定意义的单词,这就要求开发者在开发程序时,不能用这些保留字作为标识符给变量、函数、类、模板以及其他对象命名。 Python 包含的保留字可以执行如下命令进行查 >>> import keyword >>> keyw…

【自学Python】Python标识符和保留字

Python标识符 Python标识符教程 Python 对各种 变量、方法、函数等命名时使用的字符序列称为标识符。 也可以说凡是自己可以起名字的地方都叫标识符,简单地理解,标识符就是一个名字,它的主要作用就是作为变量、函数、类、模块以及其他对象…

Python 标识符与保留字(关键字)

Python中的标识符是用于识别变量、函数、类、模块以及其他对象的名字,标识符可以包含字母、数字及下划线(_),但是必须以一个非数字字符开始。字母仅仅包括ISO-Latin字符集中的A–Z和a–z。标识符对大小写敏感的,因此 FOO和foo是两个不同的对象…

python中保留字33个详细介绍

保留字33个 python保留字 说明 and 用于表达式运算,逻辑与操作 as 用于类型转换 assert 断言,用于判断变量或条件表达式的值是否为真 break 中断循环语句的执行 class 用于定义类 continue 继续执行下一次循环 def 用于定义函数或方法 del 删除变量或者…

python 的保留字

python 中 保留字 就是我们经常使用的if ,def ,and,等之类的,这些都是被赋予了特殊含义的,所以我们不能把保留字作为函数,模块名,变量,等来使用 例如下面的就是操作的 这类错误一般都是:SyntaxError: invalid syntax 常见的保留字如下: andasassertbreakclasscontinuedefdel…

Python保留字及其说明

Python保留字及其说明 **and 用于表达式运算,逻辑与操作as 用于类型转换assert 断言,用判断变量或条件表达式的值是否为真break(循环保留字) 中断循环语句的执行,用来跳出最内层for和while循环,脱离该循环后程序从循环…

Python保留字详解

python的保留字并不多,一共33个 ​ ​1.False if qFalse:#Flase 2.None 表示该值是一个空对象,空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。 >>>…

python——保留字

Python中的标识符是用于识别变量、函数、类、模块以及其他对象的名字,标识符可以包含字母、数字及下划线(_),但是必须以一个非数字字符开始。字母仅仅包括ISO-Latin字符集中的A–Z和a–z。标识符对大小写敏感的,因此 FOO和foo是两个不同的对象…

详解Python的33个保留字

Python3系列共有33个保留字。保留字(Keyword),也称为关键字,指被编程语言内部定义并保留使用的标识符。程序猿编写程序时不能定义与保留字相同的标识符。掌握一门编程语言首先要熟记其所对应的保留字。 简单介绍下Python中保留字…

Python之保留字

1.False 表示假。 //即在if语句中不会执行。注:在Python中可以给False赋值(改变原有是错误的意思) 2.True 表示真。 3.None None是一个特殊的常量,None和False不同,None不是0。None不是空字符串。None和任何其他数据类型比较永远返回Fa…

Python保留字简单释义

Guido van Rossum在1991年正式对外发布Python版本,现在已成为最流行的语言之一。 分别执行以下命令,查询Python语言中的保留字: import keywordkeyword.kwlist1.False 表示假。 //即在if语句中不会执行。注:在Python中可以给Fal…

python保留字

此篇转自微博:遂越净郝的Python保留字详解 python的保留字总览 ​ ​1.False if qFalse:#Flase 2.None 表示该值是一个空对象,空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是…

Python语言的33个保留字(记得一定要收藏好哦)

文章目录 前言一、保留字是什么?二、Python中保留字有哪些? 前言 很多大白在刚入门写代码的时候,会发现我们写的代码“五颜六色”,如下图所示: 好奇宝宝就会问,为什么不同的单词是不同的颜色呢&#xff1f…

性能测试—接口压测指标分析

原文地址:https://zhuanlan.zhihu.com/p/36587675 通常而言,Jmeter性能测试结果分析可从性能测试指标达成方面着手,然后再分析测试过程中出现的异常情况,逐一判断是否存在性能风险。 一、用户登录并发测试结果分析 1、提取测试指…

接口测试,负载测试,并发测试,压力测试区别

接口测试 1.定义:接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 2.目的&#xf…

Jmeter接口压力测试(先登录再测接口)

上一篇主要写了Jmeter测试登陆接口,但是大部分情况下,我们是要测试登陆后的页面的各个接口。所以需要把二者结合起来,可以使用Jmeter重定向。 Jmeter测试接口(包括登陆操作) 1. 创建HTTP Request先登录 参考&am…

使用JMeter进行接口压力测试

以下使用JMeter进行接口压力测试,要点如下: 1.提取token并设置为全局变量 2.准备测试数据(未连接数据库,而是导出表数据使用) 3.生成聚合报告 一、提取token并设置为全局变量 登陆接口返回数据中包含token 使用正…

接口压测总结

首先明确压测的目的:为了在业务高峰期到来之前,确保服务器经得起高峰期的压力。 但是每个系统的用户数量以及业务量都不一样。那么,在压测之前就需要根据系统的规模, 定个小目标。 一般情况,没啥人用的服务 tps 20&…

python实现接口压力测试

python实现接口压力测试 直接上代码: # -*- coding: utf-8 -*-import json import requests import logginglogging.basicConfig(levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__)restime …