神经网络用于字母识别

7

我正在尝试为一个单层神经网络添加代码,该网络以位图为输入,并具有26个输出,用于表示每个字母出现概率。

我首先要问的问题是关于添加的单隐藏层。我是否正确地认为隐藏层将拥有自己的输出值和权重?它不需要有自己的偏置吗?

我还可以确认我对前馈方面的理解是否正确吗?以下是一些伪代码:

// input => hidden
for j in hiddenOutput.length:
    sum=inputs*hiddenWeights
    hiddenOutput[j] = activationFunction(sum)
// hidden => output
for j in output.length:
    sum=hiddenOutputs*weights
    output[j] = activationFunction(sum)

假设这是正确的,那么培训会是这样的吗?
def train(input[], desired[]):
    iterate through output and determine errors[]
    update weights & bias accordingly
    iterate through hiddenOutput and determine hiddenErrors[]
    update hiddenWeights & (same bias?) accordingly

非常感谢您的帮助,我已经阅读了很多示例和教程,但仍然难以确定如何正确地完成所有操作。


4
这是作业吗?如果是,请标记为作业。不论是否是作业,都要实验;我从入门级神经网络模拟的失败中学到了很多知识。你不会无意中创建“天网”和人类的衰落之类的事情。 - msw
1
是的,已经标记了。我一直在进行实验,但不幸的是,目前的状态表现非常糟糕,显然我做错了什么。 - dylan
3个回答

1

Dylan,也许你的作业已经过期了,但我对你发布的内容有一些想法。

  • 将隐藏层的大小设置得比输入位图的大小大得多。
  • 从输入到隐藏和从隐藏到输出应该有不同的权重和偏差。
  • 花费大量时间在错误函数(鉴别器)上。
  • 要知道神经网络往往很快就会锁定一组权重(通常是不正确的)。你需要重新开始并按不同的顺序进行训练。

我学到的关于神经网络的事情是,你永远不知道它们为什么有效(或无效)。这就是将其排除在医学和金融领域之外的原因。


如果我没记错的话,神经网络的主要问题在于目前还没有办法找到误差函数的“全局最小值”。应用“脉冲”、“自适应学习率”等方法可能有助于更快地找到最小值,但你永远无法确定它是否是全局最小值。这意味着,人们必须一遍又一遍地尝试不同的方法来寻找可接受的最小值,以确保网络正常工作。 - Stefan Falk

0

你可能想要阅读http://www.ai-junkie.com/ann/evolved/nnt1.html。它详细介绍了你正在做的事情,同时提供了代码和(大部分)简单的学习解释。虽然学习方面与前馈完全不同,但这应该会给你一些关于NN本质的想法。

我认为即使是隐藏层和输出层也应该有偏差。

此外,NN可能会很棘手,首先尝试仅识别一个字母。从单个输出获得一致的高/低信号。然后尝试使用相同字母的不同变体来保持该信号。然后您可以逐步添加更多内容。您可以通过教授26个不同的网络来实现这一点,这些网络仅在匹配时输出。或者您可以将其制作为具有26个输出的大型NN。两种不同的方法。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接