了解神经网络工作原理的最佳方法是自己创建一个,本文将向您展示如何操作。神经网络(NN),也称为人工神经网络(ANN),是机器学习领域中基于生物神经网络概念的学习算法的一个子集。拥有五年多经验的德国机器学习专家AndreyBulezyuk声称:“神经网络正在革新机器学习,因为它们能够在广泛的学科和行业中有效地对抽象对象进行建模。”人工神经网络基本上由以下组件组成:输入层:接收数据并将数据传递给隐藏层输出层层与层之间的权重每个隐藏层都有一个激活函数。在这个简单的神经网络Python教程中,我们将使用Sigmoid激活函数。神经网络有很多种。在这个项目中,我们将创建一个前馈或感知神经网络。这种类型的ANN直接将数据从前向后传递。前馈神经元的训练通常需要反向传播,反向传播为网络提供一组相应的输入和输出。当输入数据传递给神经元时,它会被处理以产生输出。下图显示了一个简单的神经网络的结构:了解神经网络如何工作的最好方法是学习如何从头开始构建神经网络(不采用任何库)。在本文中,我们将演示如何使用Python编程语言创建一个简单的神经网络。问题下表显示了问题。我们将提供一个新的数据集并用它来训练神经网络,以便它可以预测正确的输出值。如上表所示,输出值始终等于输入部分中的第一个值。因此,我们希望输出的值为1。让我们看看是否可以使用Python代码来实现相同的结果(您可以在继续之前仔细阅读本文结尾处该项目的代码)。创建一个NeuralNetwork类我们将在Python中创建一个NeuralNetwork类来训练神经元以给出准确的预测。该类还将具有其他辅助函数。尽管我们不会在这个简单的神经网络示例中使用神经网络库,但我们将导入numpy库来协助计算。numpy库提供了以下四个重要的方法:exp——用于生成自然索引array——用于生成矩阵dot——用于矩阵相乘random——用于生成随机数。请注意,我们将生成随机数以确保它们的有效分布。1.Sigmoid函数的应用我们将使用Sigmoid函数绘制一条特征性的“S”形曲线作为神经网络的激活函数。这个函数可以将任何值映射到0到1之间的值,它将帮助我们对输入进行加权和归一化。在此之后,我们将创建sigmoid函数的导数来帮助计算权重的调整参数。sigmoid函数的输出可用于生成其导数。例如,如果输出变量是“x”,那么它的导数就是x*(1-x)。2.训练模型这是我们教神经网络做出准确预测的阶段。每个输入都有一个权重-可以是正数或负数。这意味着:具有较大正权重或负权重的输入将对结果输出产生更大的影响。请记住,我们最初是通过为每个随机数分配一个权重开始的。下面是这个示例神经网络的训练过程:第1步:从训练数据集中获取输入,根据训练数据集的权重对其进行调整,并通过计算神经网络输出的方法对其进行过滤。第二步:计算反向传播错误率。在这种情况下,它是神经元的预测输出与训练数据集的预期输出之间的差异。Step3:利用误差加权求导公式,根据得到的误差范围做一些小的权重调整。第4步:执行此过程的15,000次迭代。在每次迭代中,同时处理整个训练集。我们使用“.T”函数将矩阵从水平位置转换为垂直位置。因此,数字将以这样一种方式存储,最终神经元的权重将根据提供的训练数据进行优化。然后,如果要求神经元考虑与先前状态相同的新状态,它可以做出准确的预测。这就是反向传播的工作原理。打包运行***,NeuralNetwork类初始化成功后,就可以运行代码了。下面是如何在Python项目中创建神经网络的完整代码:importnumpyasnpclassNeuralNetwork():def__init__(self):#seedingforrandomnumbergenerationnp.random.seed(1)#convertingweightstoa3by1matrixwithvaluesfrom-1to1andmeanof0self.random_weight.2.random_weight.2.1))-1defsigmoid(self,x):#applyingthesigmoidfunctionreturn1/(1+np.exp(-x))defsigmoid_derivative(self,x):#computingderivativetotheSigmoidfunctionreturnx*(1-x)deftrain(self,training_inputs,training_outputs,training_iterations)复制代码:#trainingthemodel做出准确的预测,同时调整权重连续迭代范围(training_iterations):#siphonthetrainingdataviatheneuronoutput=self.think(training_inputs)#computingerrorrateforback-propagationerror=training_outputs-output#performingweightadjustmentsadjustments=np.dot(training_inputs.T,error*self.sigmoid_derivatives=self_weightsthinks(adjusticynapments(output)))自我,输入):#passingtheinputsviatheneurontogetoutput#convertingvaluestofloatsinputsinputs=inputs.astype(float)output=self.sigmoid(np.dot(inputs,self.synaptic_weights))returnoutputif__name__=="__main__":#initializingtheneuronclassneural_network=NeuralNetwork()print("BeginningRandomlyGeneratedWeights:")print(neural_network.synaptic_weights)#trainingdataconsistingof4examples--3inputvaluesand1outputtraining_inputs=np.array([[0,0,1],[1,1,1],[1,0,1],[0,1,1]])training_outputs=np.array([[0,1,1,0]]).T#trainingtakingplaceneural_network.train(training_inputs,training_outputs,15000)print("EndingWeightsAfterTraining:")print(neural_network.synaptic_weights)user_input_one=str(input("UserInputOne:"))user_input_two=str(input("UserInputTwo:"))user_input_three=str(input("UserInputThree:"))print("ConsideringNewSituation:",user_input_one,user_input_two,user_input_three)print("NewOutputdata:")print(neural_network.think(np.array([user_input_one,user_input_two,user_input_three])))print("哇,wedidit!”)运行代码后的输出:因此,我们成功创建了一个简单的神经网络神经元,首先为自己分配一些随机权重,然后使用训练示例训练自己。之后,如果一个新状态[1,0,0],它返回的值为0.9999584。还记得我们要的正确答案是1吗?这个值很接近,Sigmoid函数的输出值在0到1之间。当然,在这个例子中,我们使用只有一个神经元网络可以完成一项简单的任务。如果我们将数千个人工神经网络连接在一起会怎么样?我们能否完全模仿人类的思维方式?
