2011-12-19 71 views
2

我用Matlab神经网络工具包实现多层感知器时遇到了问题。Matlab神经网络 - 结果不好

我尝试实现神经网络,它将识别存储为二进制图像(大小40x50)的单个字符。 图像被转换成二进制向量。输出以6位编码。我用简单newff功能以这种方式(与在隐藏层30个感知):

net = newff(P, [30, 6], {'tansig' 'tansig'}, 'traingd', 'learngdm', 'mse');

然后我训练我的网络与字符的打在3名不同的字体,用以下的列车参数:

net.trainParam.epochs=1000000; 
net.trainParam.goal = 0.00001; 
net.traxinParam.lr = 0.01; 

经过训练网络正确识别训练集中的所有字符,但是... 它无法识别来自其​​他字体的更多两次字符。

我该如何改善这个简单的网络?

回答

1

你有一个非常大的数量的输入变量(2000,如果我理解你的描述)。我的第一个建议是尽可能减少这个数字。一些可能的技术包括:对输入变量进行二次采样或计算信息特征(例如行和列总数,这会将输入向量减少到90 = 40 + 50)

此外,您的输出编码为6位, 32个可能的组合值,所以我假设你使用这些来代表26个字母?如果是这样,那么你可能会更好地用另一个输出表示。考虑到看起来没有任何相似之处的各种字母将在比特1上共享1的值,使得从输入到输出的映射复杂化。每个类有1位的输出表示会简化事情。

0

您可以使用patternnet而不是newff,这会创建一个更适合模式识别的网络。由于目标函数使用一个26元素的向量,在右边的字母位置上有1(其他地方为0)。识别的输出将是一个介于0和1之间的26个实数的向量,其中识别的字母具有最高值。

确保使用来自所有字体的数据进行培训。

给作为输入的所有数据集,train将根据指定的百分比会自动将其分为列车验证试验台:

net.divideParam.trainRatio = .70; 
net.divideParam.valRatio = .15; 
net.divideParam.testRatio = .15; 

(选择你自己的百分比)。

然后测试仅使用测试集,你可以找到自己的指数纳入

[net, tr] = train(net,inputs,targets); 
tr.testInd