当前位置: 首页 > 科技观察

神经网络理论基础及Python实现

时间:2023-03-21 17:31:59 科技观察

1.多层前馈神经网络多层前馈神经网络由三部分组成:输出层、隐藏层、输出层,每一层由单元组成;输入层由训练集实例特征向量传入,并将连接节点的权重传递给下一层。上一层的输出是下一层的输入;隐藏层的数量是任意的,只有一个输入层,也只有一个输出层。层;除输入层外,隐藏层和输出层的层数之和为n,则该神经网络称为n层神经网络,下图为2层神经网络;在一层加权求和,根据方程进行变换并输出;理论上,如果有足够多的隐藏层和足够大的训练集,任何方程都可以模拟;二、设计神经网络结构在使用神经网络之前,需要确定神经网络的层数,以及每一层单元的数量;为了加快学习过程,特征向量在传入输入层之前通常需要标准化为0到1之间;离散变量可以编码为每个输入单元对应一个特征值的一个可能值如:特征值A可能有三个值(a0,a1,a2),那么可以用3个输入单元来表示A。如果A=a0,代表a0的单元的值为1,其余为0;如果A=a1,表示a1的单位值为1,其余为0;如果A=a2,则a2的单位值为1,其余为0;神经网络可以解决分类和回归问题。对于分类问题,如果有两个类别,可以用一个输出单元(0和1)来表示这两个类别;如果有两个以上的类别,每个类别由一个输出单元表示,因此输出层的单元数通常等于一个类别数量。设计最大隐藏层数没有明确规定,一般根据实验测试误差和准确率改进实验。3.如何计算交叉验证方法的准确率?最简单的方法是通过一组训练集和测试集。对训练集进行训练得到模型,将测试集输入模型得到测试结果,并将测试结果与测试集的真实标签进行比较。比较得到准确率。机器学习领域常用的一种方法是交叉验证法。一组数据不是分成2份,而是可以分成10份。第一次:第一部分作为测试集,其余9部分作为训练集;第二次:第二部分作为测试集,其余9部分作为训练集;...这样训练10次后,得到10组准确率,对这10组数据取平均值,得到平均准确率的结果。这里10是一个特例。一般来说,将数据分成k份,这种算法称为K-fold交叉验证,即每次从k份中选出一份作为测试集,剩下的k-1份作为测试集训练集,重复k次,最后取平均准确率是比较科学准确的方法。4.BP算法通过迭代对训练集中的实例进行处理;比较经过神经网络后的预测值与真实值的差异;最小化相反方向的误差(从输出层=>隐藏层=>输入层)来更新每个连接的权重;4.1、算法细节输入:数据集、学习率、多层神经网络架构;输出:经过训练的神经网络;initializationweightandbias:在-1和1之间随机初始化(或其他),每个单元都有一个bias;对于每个训练实例X,执行以下步骤:1.从输入层向前传递:用神经网络示意图分析:从输入层到隐藏层:从隐藏层到输出层:两个公式进行汇总,可以得到:Ij为当前层的单元值,Oi为上一层的单元值,wij为两层间连接两个单元值的权重值,sitaj为每层值的偏差。我们需要对每一层的输出进行非线性转换,示意图如下:当前层的输出为Ij,f为非线性转换函数,也称为激活函数,定义如下:即每一层的输出为:这样,每一层的输出值都是通过输入值转发的。2.根据误差反向传输对于输出层:其中Tk为真实值,Ok为预测值对于隐藏层:权重更新:其中l为学习率偏置更新:3.终止条件的更新低于某个阈值;predict错误率低于某个阈值;达到预设的循环次数;4.非线性转换函数上面提到的非线性转换函数f一般可以用到两个函数:(1)tanh(x)函数:tanh(x)=sinh(x)/cosh(x)sinh(x)=(exp(x)-exp(-x))/2cosh(x)=(exp(x)+exp(-x))/2(2)逻辑函数,本文用到逻辑函数。5、BP神经网络的python实现需要导入numpy模块importnumpyasnp来定义非线性转换函数。由于还需要函数的导数形式,所以一起定义deftanh(x):returnnp.tanh(x)deftanh_deriv(x):return1.0-np.tanh(x)*np.tanh(x)deflogistic(x):return1/(1+np.exp(-x))deflogistic_derivative(x):returnlogistic(x)*(1-logistic(x))设计BP神经网络的形式(有几层,每层多少个单元),使用面向对象,主要是选择哪个非线性函数,初始化权重。layers是一个列表,其中包含每层中的单元数。classNeuralNetwork:def__init__(self,layers,activation='tanh'):""":paramlayers:Alistcontainingthenumberofunitsineachlayer.Shouldbeatleasttwovalues:paramactivation:Theactivationfunctiontobeused.Canbe"logistic"or"tanh""""ifactivation=='logistic':self.activation=logisticself.activation_deriv=logistic_derivativeelifactivation=='tanh':self.activation=tanhself.activation_deriv=tanh_derivself.weights=[]foriinrange(1,len(layers)-1):self.weights.append((2*np.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)self.weights.append((2*np.random.random((layers[i]+1,layers[i+1]))-1)*0.25)实际计算法deffit(self,X,y,learning_rate=0.2,epochs=10000):X=np.atleast_2d(X)temp=np.ones([X.shape[0],X.shape[1]+1])temp[:,0:-1]=XX=tempy=np.array(y)forkinrange(epochs):i=np.random.randint(X.shape[0])a=[X[i]]forlinrange(len(self.weights)):a.append(self.activation(np.dot(a[l],self.weights[l])))error=y[i]-a[-1]deltas=[error*self.activation_deriv(a[-1])]forlinrange(len(a)-2,0,-1):deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))deltas.reverse()foriinrange(len(self.weights)):layer=np.atleast_2d(a[i])delta=np.atleast_2d(deltas[i])self.weights[i]+=learning_rate*layer.T.dot(delta)实现预测defpredict(self,x):x=np.array(x)temp=np.ones(x.shape[0]+1)temp[0:-1]=xa=tempforlinrange(0,len(self.weights)):a=self.activation(np.dot(a,self.weights[l]))返回我们给出一组数字进行预测,我们上面的程序文件将名称保存为BPfromBPimportNeuralNetworkimportnumpyasnpnn=NeuralNetwork([2,2,1],'tanh')x=np.array([[0,0],[0,1],[1,0],[1,1]])y=np.array([1,0,0,1])nn.fit(x,y,0.1,10000)foriin[[0,0],[0,1],[1,0],[1,1]]:print(i,nn.predict(i))结果如下:([0,0],array([0.99738862]))([0,1],array([0.00091329]))([1,0],数组([0.00086846]))([1,1],数组([0.99751259]))