多输出神经网络

我已经在python中构建了我的第一个神经网络,并且一直在尝试一些数据集;到目前为止一切顺利!

我有一个关于用多个结果建模事件的快速问题:-

假设我希望训练一个网络来告诉我每个跑步者赢得100米短跑的概率。我会给网络提供关于每个跑步者的所有相关数据,并且输出的数量将等于比赛中跑步者的数量。

我的问题是,使用sigmoid函数,如何确保输出的总和等于1.0?网络会自然地学会这样做,还是我必须以某种方式明确地实现这一点?如果是这样,我该如何做?

非常感谢。


回答:

你的神经网络的输出将接近 1。我不认为它实际上会达到 1。

你实际上不需要看哪个输出等于 1。一旦你将你的网络训练到一个特定的误差水平,当你呈现输入时,只需查找输出层中的最大输出即可。例如,假设你的输出层呈现以下输出:[0.0001, 0.00023, 0.0041, 0.99999412, 0.0012, 0.0002],那么赢得比赛的跑步者是 4 号跑步者。

所以是的,你的网络会“学会”产生 1,但它不会完全是 1。这就是你训练到一定误差率的原因。我最近创建了一个神经网络来识别手写数字,这就是我使用的方法。在我的输出层中,我有一个包含 10 个分量的向量。第一个分量代表 0,最后一个分量代表 9。所以当我向网络呈现 4 时,我希望输出向量看起来像[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]。当然,这并不是我真正得到的,但这就是我训练网络提供的结果。所以要找到它是哪个数字,我只需检查哪个分量具有最高的输出或分数。

现在在你的第二个问题中,我相信你是在问如何网络会学会提供正确的答案?为此,你需要为你的网络提供一些训练数据并训练它,直到输出低于某个误差阈值。所以你需要的是一组包含输入正确输出的数据。最初,你的神经网络将被设置为随机权重(有一些算法可以帮助你选择更好的权重以最大限度地减少训练时间,但这有点高级)。接下来,你需要一种方法来告诉神经网络从提供的数据中学习。所以基本上你将数据交给神经网络,它提供一个输出,这很可能是错误的。然后你将该数据与预期的(正确的)输出进行比较,你告诉神经网络更新其权重,使其更接近正确的答案。你一遍又一遍地执行此操作,直到误差低于某个阈值。

最简单的方法是实现随机反向传播算法。在此算法中,你计算神经网络的实际输出和预期输出之间的误差。然后,你将误差从输出层反向传播到隐藏层的权重,并在进行过程中调整权重。然后,你重复此过程,直到你计算出的误差低于某个阈值。因此,在每个步骤中,你都越来越接近你的解决方案。

你可以使用此处描述的算法。其中涉及大量的数学运算,所以请做好准备!如果你想查看此算法的实现示例,可以查看我在 github 上的这个 Java 代码。该代码也使用动量和一种简单的模拟退火形式,但标准的反向传播算法应该很容易辨别。关于反向传播的维基百科文章有一个链接,指向 Python 中反向传播算法的实现。

你可能无法立即理解该算法;预计会花费一些时间来理解它并完成一些数学运算。我在编码时坐在纸和笔旁,这就是我最终了解发生了什么的方式。

以下是一些资源,应该可以帮助你更好地理解反向传播:

如果你想要更多资源,你也可以看看我这里的回答。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注