Matlab神经网络 - 结果不好

时间:2011-12-19 22:38:31

标签: matlab neural-network

我在使用Matlab Neural Networks Toolkit实现多层感知器时遇到了问题。

我尝试实现神经网络,它将识别存储为二进制图像的单个字符(大小为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;

训练后网络正确识别训练集中的所有角色,但...... 它无法识别其他字体中的两个以上字符。

我怎样才能改进这个简单的网络?

3 个答案:

答案 0 :(得分:1)

你可以尝试在你的训练集中添加随机弹性失真(为了扩展它,使其更具“推广性”)。

您可以在Microsoft Research上看到这篇精彩文章的详细信息: http://research.microsoft.com/pubs/68920/icdar03.pdf

答案 1 :(得分:1)

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

此外,您的输出编码为6位,提供32种可能的组合值,因此我假设您使用这些值来表示26个字母?如果是这样,那么你可以用另一个输出表示更好。例如,考虑到看起来不相似的各种字母将在位1上共享1的值,这使得从输入到输出的映射变得复杂。每个类1位的输出表示将简化操作。

答案 2 :(得分: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