与MATLAB中的神经网络混淆



我正在使用神经网络研究字符识别(以及后来的指纹识别)。我对事件的顺序有点困惑了。我用26个字母训练网。稍后,我将增加它,包括26个干净字母和26个嘈杂字母。如果我想识别一个字母,比如"A",正确的方法是什么?这是我现在正在做的。

1)矩阵为26x100的列车网络;每行包含一个来自BMP (10x10)分割的字母。2)然而,对于测试目标,我使用"A"的输入矩阵。在第一行之后我有25行0所以我的输入矩阵和我的目标矩阵一样大。3)我运行perform(net, testTargets,outputs),其中输出是使用26x100矩阵训练的网络的输出。testTargets是A的矩阵。

这似乎不对。训练应该与识别任何字符分开吗?我希望发生的事情如下:

1)为我选择的图像文件训练网络(在将图像处理成逻辑数组之后)。

2)使用这个训练过的网络来识别不同图像文件中的字母。

那么训练网络识别A到z。然后选择一张图像,运行网络,看看从选中的图像中识别出了哪些字母。

好吧,看来这里的问题似乎更像是"我如何做神经网络",我可以在这里概述一下基本的过程,试图在你的脑海中巩固这个想法,但就实际实现而言,你得靠自己了。我个人认为专有语言(MATLAB)令人讨厌,但我总是欣赏知识分子的热情。

神经网络的基本概念是,你在层中有一系列节点,这些节点具有连接它们的权重(取决于你想做什么,你可以将每个节点连接到上面和下面的层,或者连接每个节点,或者介于两者之间的任何地方)。每个节点都有一个"工作函数"或概率函数,表示给定节点或神经元计算为"on"或1的概率。

一般的工作流程从你得到的任何顶层神经元/节点开始,将它们初始化为你的数据值(在你的情况下,你可能会开始将这些作为图像中的像素值,标准化为二进制将是最简单的)。然后,每个节点都将乘以一个权重,并向下传递给你的第二层,这将被视为一个"隐藏层",这取决于总和(几何或算术和,取决于你的实现),它将与工作函数一起使用,以确定你的隐藏层的状态。

最后一点有点理论性,很难理解,所以这里有一个例子。假设第一行有三个节点([1,0,1]),连接这三个节点到第二层第一个节点的权值类似于([0.5, 2.0, 0.6])。如果你在做算术求和,这意味着你的"隐藏层"中第一个节点的权重将是

1*0.5 + 0*2.0 + 1*0.6 = 1.1

如果您使用逻辑函数作为工作函数(一种非常常见的选择,尽管tanh也很常见),这将使该节点评估为1的机会约为75%。

你可能希望你的最后一层有26个节点,每个字母一个,但你可以添加更多的隐藏层来改进你的模型。您可以假设您的模型预测的字母将是标题权重最大的最后一个节点。

在你建立并运行之后,你想要训练它,因为你可能只是随机播种你的重量,这是有道理的。有很多不同的方法,但我一般会概述反向传播,这是一种非常常见的训练神经网络的方法。从本质上讲,由于您知道应该识别图像中的哪个字符,因此可以将结果与模型实际预测的结果进行比较。如果你的模型准确地预测了角色,你就可以让模型保持原样,因为它是有效的。如果你预测了一个不正确的字符,你想要回到你的神经网络,并增加从你输入的像素节点到应该被预测的字符的结束节点的权重。您还应该减少导致它错误返回的字符的权重。

希望这对你有帮助,如果你还有什么问题,请告诉我。

最新更新