Python中怎么构建神经网络


这篇文章给大家介绍Python中怎么构建神经网络,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。神经网络的工作原理
在一个简单的神经网络中,神经元是基本的计算单元。它们获取输入特征并将其作为输出。以下是基本神经网络的外观:这里,“layer1”是输入特征。“Layer1”进入另一个节点layer2,最后输出预测的类或假设。layer2是隐藏层。可以使用多个隐藏层。你必须根据你的数据集和精度要求来设计你的神经网络。从第1层移动到第3层的过程称为前向传播。前向传播的步骤:为每个输入特征初始化系数。比方说,我们有100个训练例子。这意味着100行数据。在这种情况下,如果假设有10个输 香港云主机入特征,我们的输入矩阵的大小是100×10。现在确定$_1$的大小。行数需要与输入特征的数量相同。在这个例子中,是10。列数应该是你选择的隐藏层的大小。将输入特征X乘以相应的,然后添加一个偏置项。通过激活函数传递结果。有几个激活函数可用,如sigmoid,tanh,relu,softmax,swish我将使用一个sigmoid激活函数来演示神经网络。这里,“a”代表隐藏层或第2层,b表示偏置。g(z)是sigmoid激活函数:为隐藏层初始化$theta_2$。大小将是隐藏层的长度乘以输出类的数量。在这个例子中,下一层是输出层,因为我们没有更多的隐藏层。然后我们需要按照以前一样的流程。将和隐藏层相乘,通过sigmoid激活层得到预测输出。反向传播是从输出层移动到第二层的过程。在这个过程中,我们计算了误差。首先,从原始输出y减去预测输出,这就是我们的$delta_3$。现在,计算$theta_2$的梯度。将$delta_3$乘以$theta_2$。乘以“$a^2$”乘以“$1-a^2$”。在下面的公式中,“a”上的上标2表示第2层。请不要把它误解为平方。用训练样本数m计算没有正则化版本的梯度$delta$。修正$delta$。将输入特征乘以$delta_2$乘以学习速率得到$theta_1$。请注意$theta_1$的维度。重复前向传播和反向传播的过程,并不断更新参数,直到达到最佳成本。这是成本函数的公式。只是提醒一下,成本函数表明,预测离原始输出变量有多远。如果你注意到的话,这个成本函数公式几乎和逻辑回归成本函数一样。我将使用Andrew Ng在Coursera的机器学习课程的数据集。请从以下链接下载数据集:https://github.com/rashida048/Machine-Learning-With-Python/blob/master/ex3d1.xlsx下面是一个逐步实现的神经网络。我鼓励你自己运行每一行代码并打印输出以更好地理解它。首先导入必要的包和数据集。这是数据集的前五行。这些是数字的像素值。在这个数据集中,输入和输出变量被组织在单独的excel表格中。让我们导入输出变量:这也是数据集的前五行。输出变量是从1到10的数字。这个项目的目标是使用存储在’df’中的输入变量来预测数字。求输入输出变量的维数输入变量或df的形状为5000 x 400,输出变量或y的形状为5000 x 1。定义神经网络为了简单起见,我们将只使用一个由25个神经元组成的隐藏层。得到输出类。正如你在上面看到的,有10个输出类。初始化和偏置我们将随机初始化层1和层2的。因为我们有三层,所以会有$theta_1$和$theta_2$。$theta_1$的维度:第1层的大小x第2层的大小$theta_2$的维度:第2层的大小x第3层的大小从步骤2开始,“df”的形状为5000 x 400。这意味着有400个输入特征。所以,第1层的大小是400。当我们指定隐藏层大小为25时,层2的大小为25。我们有10个输出类。所以,第3层的大小是10。$theta_1$的维度:400 x 25$theta_2$的维度:2510同样,会有两个随机初始化的偏置b1和b2。$b_1$的维度:第2层的大小(本例中为25)$b_1$的维度:第3层的大小(本例中为10)定义一个随机初始化theta的函数:使用此函数初始化theta现在,初始化我们上面讨论过的偏置项:实现前向传播使用前向传播部分中的公式。为了方便起见,定义一个函数来乘以和X我们也将多次使用激活函数。同样定义一个函数现在我将逐步演示正向传播。首先,计算z项:现在通过激活函数传递这个z1,得到隐藏层a1是隐藏层。a1的形状是5000 x 25。重复相同的过程来计算第3层或输出层a2的形状是5000 x 10。10列代表10个类。a2是我们的第3层或最终输出。如果在这个例子中有更多的隐藏层,在从一个层到另一个层的过程中会有更多的重复步骤。这种利用输入特征计算输出层的过程称为前向传播。实现反向传播这是反向计算梯度和更新的过程。在此之前,我们需要修改’y’。我们在“y”有10个类。但我们需要将每个类在其列中分开。例如,针对第10类的列。我们将为10替换1,为其余类替换0。这样我们将为每个类创建一个单独的列。之前我一步一步地演示了向前传播,然后把所有的都放在一个函数中,我将对反向传播做同样的事情。使用上述反向传播部分的梯度公式,首先计算$delta_3$。我们将使用前向传播实现中的z1、z2、a1和a2。现在使用以下公式计算delta2:这里是delta2:在这里我们需要学习一个新的概念。这是一个sigmoid梯度。sigmoid梯度的公式为:如果你注意到了,这和delta公式中的**a(1-a)**完全相同。因为a是sigmoid(z)。我们来写一个关于sigmoid梯度的函数:最后,使用以下公式更新:我们需要选择一个学习率。我选了0.003。我鼓励你尝试使用其他学习率,看看它的表现:这就是需要更新的方式。这个过程称为反向传播,因为它向后移动。在编写反向传播函数之前,我们需要定义成本函数。因为我会把成本的计算也包括在反向传播方法中。但它是可以添加到前向传播中,或者可以在训练网络时将其分开的。这里m是训练实例的数量。综合起来的代码:训练网络我将用20个epoch训练网络。我在这个代码片段中再次初始化theta。我使用了0.003的学习率并运行了20个epoch。但是请看文章末提供的GitHub链接。我有试着用不同的学习率和不同的epoch数训练模型。我们得到了每个epoch计算的成本,以及最终更新的。用最后的来预测输出。预测输出并计算精度只需使用假设函数并传递更新后的来预测输出:现在计算一下准确率,关于Python中怎么构建神经网络就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

相关推荐: 这些小程序技巧,你敢说你一个用不到?

都是小技巧,废话不多说,上代码!改变小程序原生组件大小微信官方提供了一些基本组件,但是有的组件没有提供类似size的属性,我们只需要一个css就可以解决,以radio为例:小程序picker组件的range-key不生效小程序picker使用过程中发现按官方文…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/03 13:00
下一篇 08/03 13:02

相关推荐