东莞网站平台后缀wordpress 付款查看
东莞网站平台后缀,wordpress 付款查看,logo商标设计注册,无极磁力深度学习基础Python小鱼书笔记#xff08;部分#xff09;
感知机
1.基础公式:
w1x1w2x2θ
w_1x_1w_2x_2\theta
w1x1w2x2θ
w_1 w_2 为权重#xff0c;x_1 x_2 为输入信号#xff0c;y 为输出信号#xff08;输出0或1#xff09;
此时神经元被激活&a…深度学习基础Python小鱼书笔记部分感知机1.基础公式:w1x1w2x2θ w_1x_1w_2x_2\thetaw1x1w2x2θw_1 w_2 为权重x_1 x_2 为输入信号y 为输出信号输出0或1此时神经元被激活y的值为1反之y的值为0。其实就是模仿生物学中的神经元。w1x1w2x2b0 w_1x_1w_2x_2b0w1x1w2x2b0此式子加了个b偏置,实际上b就是(-theta),这样直接和0比较就能判断神经元是否被激活。2.与Numpy的联系 import numpy as np x np.array([0, 1]) #输入 w np.array([0.5, 0.5]) # 权重 b -0.7 #偏置 w*x array([ 0. , 0.5]) np.sum(w*x) 0.5 np.sum(w*x) b-0.19999999999999996 # 大约为-0.2由浮点小数造成的运算误差直接使用numpy中对于数组进行相乘相加直接实现或与非门的模仿3.各种门的实现#与门defAND(x1,x2):xnp.array([x1,x2])wnp.array([0.5,0.5])b-0.7tmpnp.sum(w*x)biftmp0:return0else:return1#与非门defNAND(x1,x2):xnp.array([x1,x2])wnp.array([-0.5,-0.5])# 仅权重和偏置与AND不同b0.7tmpnp.sum(w*x)biftmp0:return0else:return1#或门defOR(x1,x2):xnp.array([x1,x2])wnp.array([0.5,0.5])# 仅权重和偏置与AND不同b-0.2tmpnp.sum(w*x)biftmp0:return0else:return1Q:这个b的取值有点随机…为什么去0.70.2而不取0.60.3等等这些值不是唯一的存在一个连续的范围可以工作作者的选择是合理的在可行范围内选择了简单、对称的值对于教学目的使用这些值可以让读者看到三种门的相似性和差异性实际应用中这些参数通常通过训练如感知机学习算法得到而不是手动设置4.异或门(单层感知机局限性)仅当x1或x2中的一方为 1时才会输出1“异或”是拒绝其他的意思x1x2y000101011110————单层感知机是无法实现这个异或门的————感知机也有局限Why可以在坐标轴上面画一个有各种情况构成的(x1,x2)的四个点以及他们对应的y值三角形表示1圆形表示0看能不能在坐标轴上画一条直线把它们分开。如下图无法在坐标轴上面画出一条直线把三角形和圆形分开。解决方案改为非线性曲线用弯曲的曲线来分成两个区域————看下一节多层感知机可以由此实现非线性的功能5.多层感知机(异或门的实现以及感知机的高级功能)通过组合各个感知机能实现多种感知机包括异或门x1x2s1s2y00100101110111111010如上述表格正好满足异或门的要求#代码实现defXOR(x1,x2):s1NAND(x1,x2)s2OR(x1,x2)yAND(s1,s2)returny通过叠加层加深层感知机能进行更加灵活的表示。6.Summary感知机这一章结束看完这一章我掌握了或门与门非门异或门的逻辑含义并通过公式了解到如何在Python中实现感知机的功能。还有很重要的多层感知机可以表达出单层感知机达不到的非线性作用。Q不会构建多层感知机比如说那个异或门我就看的很懵是怎么构建出来的Q对于那几个基本的逻辑门还是需要再去熟悉一下。神经网络1.基本概况机器自动找到合适的权重 神经网络的一个重要性质就是从数据中自己学习的到合适的参数权重结构输入层————中间层————输出层 几层网络的判定输入层隐藏层输出层总数减一表示神经元有权重的数量2.激活函数感觉就像感知机的基础公式就是展现了实现原理激活函数计算过程把前面感知机加权计算过程的结果转为某个数a,然后再通过某个函数判断正负即可。————此类超过阈值就激活的函数被称之为阶跃函数此类函数就正好是感知机的应用。阶跃函数是激活函数的一种。其他激活函数sigmoid函数h(x)11e−x h(x) \frac{1}{1 e^{-x}}h(x)1e−x1根据图像我感觉他是相较于那么激烈的函数是比较平缓的。阶跃函数在使用时的 Numpy技巧1.缺陷使用单独值传递时不能传递数组会导致对于传入数据不太方便只能传递浮点数def step_function(x): if x 0: return 1 else: return 02.改进把Numpy数组传入然后将其中的数按照政府改为布尔类型再改为000111类型。从而实现Numpy数组的传入。 import numpy as np x np.array([-1.0, 1.0, 2.0]) x array([-1., 1., 2.]) y x 0 y array([False, True, True], dtypebool) y y.astype(np.int) y array([0, 1, 1]) #数组中大于0的转换为1小于0的转换为0。从而实现数组类型的转换Q:这个技巧具体有什么用我现在还看不太出来:之后再看我估计我就能看懂了函数的图型表示使用图形来表示上述阶跃函数。用到matplotlibimport numpy as np import matplotlib.pylab as plt def step_function(x): return np.array(x 0, dtypenp.int) x np.arange(-5.0, 5.0, 0.1) y step_function(x) plt.plot(x, y) plt.ylim(-0.1, 1.1) # 指定y轴的范围 plt.show() #np.arange(-5.0, 5.0, 0.1)在−5.0到5.0的范围内以0.1为单位生成NumPy数组[-5.0, -4.9, ..., 4.9].step_function()以该NumPy数组为参数对数组的各个元素执行阶跃函数运算并以数组形式返回运算结果。对于上述代码还是有点不太熟练。这个函数的理解生成了把阶跃函数转化为010101形式展示出-5–5的函数图像图像如下图sigmoid函数的代码实现def sigmoid(x): return 1 / (1 np.exp(-x)) x np.array([-1.0, 1.0, 2.0]) sigmoid(x) array([ 0.26894142, 0.73105858, 0.88079708]) #Q为什么能对于Numpy数组用展现出了它的广播功能只要注意与上面的阶跃函数不太一样罢了。对于广播功能怎么再这个函数中得到应用的两种函数的比较阶跃函数与sigmoid函数阶跃函数sigmoid函数连续变化性剧烈平缓返回值0和1多种小数等共同点两者的结构均是“输入小时输出接近0为0 随着输入增大输出向1靠近变成1”。也就是说当输入信号为重要信息时 阶跃函数和sigmoid函数都会输出较大的值当输入信号为不重要的信息时 两者都输出较小的值。还有一个共同点是不管输入信号有多小或者有多 大输出信号的值都在0到1之间。二者都是非线性函数线性函数是一条笔直的直线为了发挥叠加层所 带来的优势激活函数必须使用非线性函数如果是线性的还不如直接用函数表示因为线性是一条直线展示不出多层神经网络带来的优势ReLU函数含义ReLU函数在输入大于0时直接输出该值在输入小于等于0时输 出0def relu(x): return np.maximum(0, x)3.多维数组的运算多维数组通过np.dim()函数获得数组的维度通过__.shape函数获得数组的形状 注意返回的结果是个元组是因为一维数组的情况下也要返回和多维数组的情况下一致的结果通过__.shape[]函数获得数组某一行的形状 获得一个数字二维数组也被称作矩阵矩阵乘法矩阵的乘积是通过左边矩阵的行横向和右边矩阵的列纵 向以对应元素的方式相乘后再求和而得到的哦哦大致理解不过这种矩阵乘法的方式有点陌生需要再去记一记公式对应np.dot(A, B)np.dot()接收两个NumPy数组作为参数并返回数组的乘积。这里要注意的是np.dot(A, B)和np.dot(B, A)的 值可能不一样。和一般的运算或*等不同矩阵的乘积运算中操作数A、 B的顺序不同结果也会不同。顺序不同结果也有可能不同在运行矩阵乘法时保持一致注意要是矩阵的0维的列数和相乘矩阵的行数相等否则无法进行乘法会出现错误结果C矩阵也是由A和B共同决定的矩阵C的形状是由**矩阵A的行数和矩阵B的列数构成的**通过矩阵的乘积一次性完成计算的技巧在 实现的层面上可以说是非常重要的4.三层神经网络的实现主要是理解那个 w 的符号含义在后续写公式时很有用。例题如下一般地回归问题可以使用恒等函数二元分类问题可以使用sigmoid函数 多元分类问题可以使用softmax函数。溢出指的是在计算过程中出现了比精度更长的数导致程序对于数据的处理没有那么准确容易出现错误。比如说softmax函数中的分母就很容易出现内存溢出导致计算错误。softmax函数对于上式所说的内存溢出的问题可以利用它的一个特性来解决就是在指数上减去数组中最大的一个数。def softmax(a): c np.max(a) exp_a np.exp(a - c) # 溢出对策 sum_exp_a np.sum(exp_a) y exp_a / sum_exp_a return y特性输出总和是1./体现在将输出都转换为其所占的比例中。因此可以将其解释为概率。解释为概率又有什么用处呢在下一章会有不小的用处在MNIST数据集上实现数字的识别具体实践看我手写的文件夹其中我进行了对于MNIST数据集的实操演练。神经网络的学习概述就像我们人学习去识别数字文字等我们往往很容易去识别出什么数字是什么数字但是我们很难用程序去精确量化分析来区别它们之间的差别。所以机器学习来了神经网络的就是来解决这些问题的————通过一个完全没有人为干预的程序实现对于难以描述区别的图像进行区分与分类。正像我之前在做人脸识别小组作业的过程中学习到的三元组优化损失人脸识别也正如此先统一人脸正如书中所提出的正规化提高程序的鲁棒性。三元组优化损失我觉得正是训练机器学习的一个方法。“黑箱原理”不问过程直接出结果。端到端机器学习从输入数据到输出数据过程全程没有人工参与。关于对于数据的处理数据分为两类训练数据也叫做监督数据与测试数据 他们的作用不言而喻泛化能力是机器学习的最终目标就是让机器能够在最大准确率上能够识别出从未见过的数字等。判断结果对于某个数据集过于成功而对于其他数据集表现得很糟糕这种现象被称为过拟合会导致其泛化能力比较弱。根据以上分析我可以推断得出1.数据的收集也非常重要我觉得数据如果收集的“多样性”较高它的过拟合我觉得就不太可能出现。损失函数作为指标帮助神经网络寻找最佳权重一般使用均方误差和交叉熵误差这两种误差我还是不太清楚他们具体代表的表达式我不太理解即当前的 神经网络对监督数据在多大程度上不拟合在多大程度上不一致。Q欸如果误差越小表明其与数据拟合度越高也可能出现过拟合么如果给损失函数乘上一个负值就可以解释为“在多大程度上不坏” 即“性能有多好”均方误差yk是表示神经网络的输出tk表示监督数据k表示数据的维数最后的结果为整数越小越说明它的拟合效果越好程序的结果越好。ONE—HOT表示对于输出正确的数据表示为1其他为0.def mean_squared_error(y, t): return 0.5 * np.sum((y-t)**2)交叉熵误差tk中只有正确解标签的索引为1其他均为0one-hot表示def cross_entropy_error(y, t): delta 1e-7 return -np.sum(t * np.log(y delta))计算总共的平均的损失 由于前面的误差仅仅是对于单个数据进行误差的计算而对于大量数据的平均损失计算去全部计算是不现实的。而如果我们去从庞杂的数据中去随机找寻一部分有这一部分的平均来近似表示总共的损失作为指标是解决问题的方法。np.random.choice(60000,10)#会从0到59999之间随机选择10个数字np.sum((y-t)**2)###### 交叉熵误差 [外链图片转存中...(img-6FVVSUJl-1772937414098)] tk中只有正确解标签的索引为1其他均为0one-hot表示 Python def cross_entropy_error(y, t): delta 1e-7 return -np.sum(t * np.log(y delta))计算总共的平均的损失 由于前面的误差仅仅是对于单个数据进行误差的计算而对于大量数据的平均损失计算去全部计算是不现实的。而如果我们去从庞杂的数据中去随机找寻一部分有这一部分的平均来近似表示总共的损失作为指标是解决问题的方法。np.random.choice(60000,10)#会从0到59999之间随机选择10个数字