(32)代码优化二 修改均方误差值

(32)代码优化二 修改均方误差值

代码优化二:计算方法优化,根据下图的公式修改均方误差值(mean-square error,

MSE),MSE 反映估计量与被估计量之间差异程度的一种度量。求方差的时候可以将公式稍微改一下,除以2,再次运行看一下效果。

www.zeeklog.com  - (32)代码优化二 修改均方误差值

将Create_AI_Framework_In5Classes(Day4)的LossComputation.py 中的代码:

total_loss =total_loss + squared_error


www.zeeklog.com  - (32)代码优化二 修改均方误差值

修改成如下代码。total_loss = total_loss + squared_error/2

修改以后,再次重新运行Neuron_Network_Entry.py,运行结果如下:

www.zeeklog.com  - (32)代码优化二 修改均方误差值

将修改以后代码运行效果跟之前的运行结果做对比,将平方差除以2的运行结果发现左侧不规则的现象更明显了,这跟实际数据的不同情况有关系,除以2这是求方差的一个正常的公式,实际在写代码的时候要不断的调整。

1)      正则化处理Feature Normalization。

接下来我们将进行数据正则化,看看效果怎么样?数据正则化要写一个正则化的方法。前面我们已经讲解了正则化的背景、意义及工作的过程,这里将只有0,1的数据变成-4到4之间的数据。正则化有一个幅度的问题,数据的最小值是-4,最大值是4,尽可能平衡的将数据分布在-4到4的区间,这是基本思路。

在service目录中创建一个FeatureNormalization.py文件。先创建一个类FeatureNormalization,在类FeatureNormalization中定义一个方法normalize,normalize方法对输入的数据instances进行正则化的过程。Neuron_Network_Entry.py中有输入的数据源:[0,0],[0 ,1],[1,0],[1,1],将对输入的数据(第1列数据,第2列数据)进行正则化,正则化到什么程度?需正则化到-4到4之间。首先获得特征数num_of_elements,取出整个输入数据的第0个实例,正则化的时候是否需要将结果(第3列数据)正则化?结果(第3列数据)需要进行正则化,输入数据0,1(第1列数据,第2列数据)变成了-4到4的内容,如果结果(第3列数据)不相应进行正则化,那计算的数据和原来的结果就不太符合,因此,这len(instances[0])不用再减去1,将所有的输入数据第1列,第2列,第3列数据都进行正则化。

max_items、min_items记录里面的成员,接下来进行循环遍历,temp_max是临时的最大值,计算的时候要进行比较,这里涉及一些数学内容,数学公式根据激活函数来的,按照激活函数本身的形态以及求导要求的内容进行正则化实现,temp_max、temp_min是instances第0个输入实例中的值,instances的值有4行3列,第0行的值是[0,0,0],然后循环遍历所有的元素,得到每一个元素。注意:为什么先循环遍历num_of_elements,然后循环遍历instances?循环的时候num_of_elements本身j是不变的,变化的是实例instances本身i,每一次循环遍历实例的时候,计算的是每一行的数据还是计算每1列的数据呢?这里计算的是每1列的数据,为什么按列进行操作,因为instances中的1列就是一个feature。instances有3列,循环的时候变量j取range(num_of_elements)的下标0,1,2 ,如当变量j在初始位置0的时候,循环遍历所有的实例,将第0列的所有数据获取过来,进行正则化的时候是针对Input Source(这里指的是数据源Input Source,而不是指Input Layer输入层)的每一列数据进行的操作。例如TensorFlow的可视化图中,x1是一个神经元的数据,是一个Feature,x2是另外一个Feature,x1和x2里面的数据是输入实例不同列的数据,正则化需对输入的每一列的数据进行相应的正则化,不可能对每一行的数据进行正则化,在进行某种算法计算的时候,对第一行第一个元素进行了一种算法操作,第二行第一个元素也要进行了同种类型的算法操作,这才是所谓的正则化。

接下来,计算这1列数据中的最大值、最小值。如果当前的值大于临时设置的最大值,将当前的值赋值给临时的最大值,这里指不是整个区间的最大值,整个区间的值在-4和4之间。如果当前的值小于临时设置的最小值,将当前的值赋值给临时的最小值。循环以后找到这1列的最大值,最小值,这里Instances的最小值是0,最大值是1。实际的数据可能有几百个Feature,数据的多样化就极大的提升。计算出这1列中的最大值、最小值以后,将最大值、最小值追加到max_items、min_items数组中,因为变量j循环遍历是对每1列的遍历,追加到数组时就获得当前每1列的最大值、最小值。这样就求出了每一个Feature(在这里也包含了对结果的正则化操作,这样才能保证误差的真实性)的最大值和最小值。最后1列是真实值,如果不进行结果的正则化,而只进行特征Feature的正则化,然后将预测值和真实值相减,计算出的误差肯定不符合实际情况。

接下来实现正则化的逻辑。正则化要循环所有的实例,循环所有的Feature,正则化和前面的操作是不一样的,前面的操作是针对一列一列的数据,这里的操作是针对一行一行的数据,操作每一行具体的值,对每一行的内容进行修改,提取出当前输入行对应列的元素本身,例如instances第1行第1列的元素是0,第1行第2列的元素是0,第1行第3列的元素是0,然后获取当前行的元素所在的列的最大值maxItem和最小值minItem,之前我们计算的是每1列的最大值和最小值,现在根据列的索引进行提取,max_items[j]取j列的最大值,min_items[j]取j列的最小值。如果j等于最后一个元素,最后一个元素是真实的值,则记录一下结果,newMax是1,newMin是0;否则,newMax是4,newMin是-4。为什么最后1列的值最大值是1,最小值是0?如果是最后1列,最后1列是实际的值,在0到1之间,而Sigmoid激活函数计算的值也在0到1之间,因此,最小值是0,最大值是1;但是如果是Feature,Feature是x的值,例如是神经网络输入层节点的x1,x2,x值在-4到4之间,Feature进行正则化的时候,为了最大程度的发挥Sigmoid函数的功能,把最大值newMax设置4,最小值newMin设置为-4。正则化到什么地步?正则化到符合Sigmoid函数的定义域和值域,定义域和值域分别是x和y 的区间,x的有效区间是-4到4,y的有效区间是0到1。然后按照正则化计算公式,根据((newMax - newMin)*((value - minItem) /(maxItem - minItem))) + newMin计算出value值。这样就实现了正则化,然后将value赋值给instances[i][j],返回instances。


本文根据王家林老师《5节课内从零起步(无需数学和Python基础)编码实现AI人工智能框架电子书》整理。

www.zeeklog.com  - (32)代码优化二 修改均方误差值

Read more

DES加密算法的使用

DES加密算法的使用

最近项目在写工具类的时候用的加密解密算法是3DES,就总结一下DES-3DES-AES吧,按顺序来,先介绍下DES吧; DES:是对称算法的以一种(加密、解密过程是可逆的,并且使用的密钥是一致的),关于加密算法的介绍,对称、非对称具体哪些,什么场景,大家可以翻看我之前的博客; 这里讲到加密解密算法,就简单说一下当下分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。 而DES就基本符合这点;它把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1); 它的算法基本分两部,初始置换和逆置换;具体

By Ne0inhk
在Docker应用场景下 如何使用新技术快速实现DevOps

在Docker应用场景下 如何使用新技术快速实现DevOps

在Docker应用场景下 如何使用新技术快速实现DevOps @Container容器技术大会是由国内容器技术社区DockOne组织的专为一线开发者和运维工程师设计的顶级容器技术会议,会议强调实践和交流,话题设置围绕容器、运维、云计算等技术领域,力求全方面、多角度为参会者解读容器技术。近日,OneAPM华东区技术总监戚权歆在容器技术大会分享了在Docker应用场景下,如何使用新技术快速实现DevOps。 众所周知,DevOps是开发(Development)和运维(Operations)的组合,代表一种文化、运动或实践,旨在促进软件交付和基础设施变更软件开发人员(Dev)和 IT 运维技术人员(Ops)之间的合作和沟通。尤其是在2016年,DevOps 逐渐成为IT技术圈内的一个新主流,越来越多的公司也认识到,采用 DevOps 的最佳实践就可能带来性能和经济效益的最大化。包括全球多家大型的互联网公司在内,以及财富500强公司的DevOps 采用率也在逐步攀升。 ITOM 能够帮助企业快速实现DevOps 从2016年开始,IT开发环境进一步虚拟化和云化,甚至开发人员的工作站都

By Ne0inhk
Spring JDK、Cglib动态代理梳理

Spring JDK、Cglib动态代理梳理

最近聊起动态代理,想起很早的时候写过一些,但不是很精髓,随着应用的加深,现在在梳理一下吧,经常自省,总结,温故知新。 说到代理,有很多说法,比如Ajax通过服务器的反向代理也可以实现跨域呀,Spring AOP实现,Java的多态实现,拦截器的原理、Hibernate懒加载的原理等等都会用的代理。这里主要说下Spring中的JDK静态、动态代理、和Cglib代理; 先说下代理的一些场景: 1. 在方法前后进行日志处理。 2. 进行额外的校验,比如参数的验证功能等。 3. 实现一些懒加载,也就是实例化的时候如果不去调用真正的方法的时候,这个类的属性就不会存在(Hibernate有这样类似的功能)。 JDK 静态代理: 代理类: import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class StudentProxy implements StudentInterface { private static final Logger

By Ne0inhk
深入理解HTTP协议(转)

深入理解HTTP协议(转)

1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。 HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

By Ne0inhk