2013-05-03 63 views
0

我一直在MATLAB的字符识别程序工作了一段时间,现在问了一些关于stackoverflow的问题并收到了很好的反馈。所以我想我会再次尝试我的运气。网络输入大小的问题

问题:我在网络中遇到了这个错误。

“输入1大小与net.inputs {1} .size不匹配。”

我使用下面的照片。我想用图片1来训练我的网络,以识别图片2中的内容。在我可以训练网络之前,我会预处理这些图像。我编写了一个程序来提取图像中的每个字母并将图像转换为二进制矩阵。例如,如果我的每个字母的网格是10x10,那么在我的第一个图像中,我将有一个10x10x4矩阵和第二个图像10x10x2。

所以现在我有一个目标矩阵10x10x4和一个输入矩阵10x10x2。

为了训练网络,我需要重塑图像中的每个10x10图层,以便每个图层都使用(:)运算符“转换”为一行。因此,目标矩阵的大小为4x100,输入矩阵的大小为2x100。

培训: 这是我的理解是,为了让网络得到训练,识别第一个图像(目标)中的字符,我需要对这些目标进行训练。因此,我使用下面的代码。

[net, tr] = trainNNet(100, train, targets); 

为了执行实际识别,我模拟了输入矩阵中每一行的网络并使用索引记录输出。因此,我使用for/loop逐行执行输入矩阵,模拟网络,并将输出发送到我的findmatch函数。此功能的目的是查找输入数组匹配的目标中的行。这对于这个错误并不重要。

[r c d] = size(input); 

for k = 1:d 
    input = input(k,:); 
    outputs = round(sim(net,input)); 

    [matched(:,k), ind(:,k)] = findmatch(outputs, targets); 
end 

我想知道为什么我一直得到错误“输入1大小不匹配net.inputs {1} .size。” 如果我在输入图像中只有一个字母,此程序正常工作。任何建议将不胜感激。

targets

input

编辑:我以上,我使用的(:)操作者提及。这是个错误。我使用下面的代码将矩阵重塑为我需要的东西。

[r c d] = size(input); 
C = permute(input,[3 2 1]); 
newinput = reshape(C,d,r*c,1); 

因此,例如,给出下面的矩阵:

input(:,:,1) = [1 2;3 4]; 
input(:,:,2) = [5 6;7 8]; 
input(:,:,3) = [9 10;11 12]; 

你会得到:

newinput = [1,2,3,4;5,6,7,8;9,10,11,12]; 

另外,我在指出这个工程的一个字母犯了一个错误。这只适用于一个字母只有如果我用我想要识别的字母训练网络。我训练使用,

[net, tr] = trainNNet(100, input, targets); 

其中输入是1x100(一个字母)。

+0

请告诉你如何从[10 10 4]到[4 100]。难道你正在做一个你不应该做的转位? – Floris 2013-05-03 02:05:40

+0

@弗洛伊斯我已经编辑了我的帖子以进行整形。我错误地说我使用了(:)运算符。我为此编写了不同的代码,这是我在示例中包含的代码。 – roldy 2013-05-03 02:23:51

+0

我相信我找到了解决方案。我需要将零行添加到输入矩阵,以便它与目标/训练矩阵的大小相同。我将不得不在不同的图像上进行测试。 – roldy 2013-05-03 03:17:07

回答

0

假设我明白为了训练网络,我使用目标值作为目标,并将其作为输入,我找到了一种使模拟运行的方法。

对于模拟中的输入,您必须添加零行,以便生成的输入矩阵与目标矩阵的大小相同。