一段时间以来,我一直在 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 不匹配。” 如果输入图像中只有一个字母,该程序可以正常工作。任何建议将不胜感激。
编辑:我上面提到我使用了 (:) 运算符。这是个错误。我使用以下代码将矩阵重塑为我需要的。
[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(一个字母)。