2011-04-06 62 views
2

根据last question,我能够使用已提供的方法保存功能设置。神经网络的进给功能

FeaturesTest.roundness = roundness;  
FeaturesTest.nWhite = nWhite; 
FeaturesTest.color = color; 
FeaturesTest.descriptors = descriptors; 
FeaturesTest.outputs = outputs; 
FeaturesTest = {roundness,nWhite, color, descriptors, outputs}; 

现在我的第一个4个特征输入神经网络,第5个特征输入到目标。我是这样写的。

load('features.mat','FeaturesTest'); 
A = FeaturesTest; 
P=A(:,1:4)'; 
T=A(:,5:5)'; 
rand('seed', 491218382); 
net = newff(minmax(P),T,20); 

现在同样的错误出现输入功能...

???错误使用==> horzcat参数尺寸不是 一致。错误在==> minmax at 38 pr {i} = minmax([p {i,:}]);

有没有人有这方面的想法?


@Itamar Katz感谢您向我展示单元阵列和结构的使用。我现在改了它。有这样一个函数返回一个图像的特征。圆度和nWhite只有一个值。描述符是移位描述符。有5种类型的输出。对于第一个图像输出应该是1,第二个,2等等。颜色显示在.mat文件中[196,186,177]。输出类似于[1,0,0,0,0]。

function[FeaturesTest] = features(image) 
[siftImage, descriptors, locs] = sift(image); 
FeaturesTest = {roundness, nWhite, color, descriptors, outputs}; 

现在从训练集中逐一获取图像,并为每个图像调用上述函数。

for i=1:size(list, 1); 
    if (~(list(i).isdir)) 
     [FeatureSet] = features(fullfile('F:\ProjectWork\Coin_Recognition\TrainingSet', list(i).name)); 
     Features = [Features; FeatureSet]; 
    end 
end 
save('features.mat','Features'); 

现在我想训练这个功能。我做的是

load('features.mat','Features'); 
A = Features; 
P=A(:,1:4)'; 
T=A(:,5:5)'; 
rand('seed', 491218382); 
net = newff(minmax(P),T,20); 
Error comes here. 

请帮帮我。谢谢。 6个图像

features.mat文件是这样的

0.776914651509411 1874 [196,186,177] <14x128 double> 
    [1,0,0,0,0] 
0.839974548665116 1794 [219,213,202] <7x128 double> 
    [1,0,0,0,0] 
0.841707612525928 1796 [192,182,171] <5x128 double> 
    [1,0,0,0,0] 
0.861761793121658 1783 [202,199,192] <13x128 double> 
    [1,0,0,0,0] 
0.411077484660635 3689 [97,88,72] <238x128 double> 
    [0,1,0,0,0] 
0.844865287736163 3372 [166,139,89] <228x128 double> 
    [0,1,0,0,0] 

回答

0

您链接到答案使用一个单元阵列,与字段的结构的建议,但你正在做,和你的最后一行:

FeaturesTest = {roundness,nWhite, color, descriptors, outputs}; 

只是覆盖FeaturesTest使其成为一个单元阵列,所以所有的行之前是不相关的。

我猜你需要的是这样的:

P = [roundness(:), nWhite(:), color(:), descriptors(:)]; 
T = outputs(:); 

但是,如果你给有关每个字段的尺寸信息,它会更容易帮助您找出错误。

+0

谢谢。在特征提取功能中,像这样返回特征。 FeaturesTest.nWhite = nWhite; FeaturesTest.descriptors =描述符; FeaturesTest.roundness =圆度; FeaturesTest.color = color; FeaturesTest.outputs =输出;然后FeaturesTest = {圆度,nWhite,颜色,描述符};假设一个图像的圆度为<1x1 double>颜色为<1x3 double> nWhite为<1x1 double>描述符为<14x128 double>,输出为<1x5 double>有18个硬币需要训练。所以FeaturesTest输入和输出是<18x5 cell> – 2011-04-06 08:59:58

+0

请参考我上面的问题。我编辑它以提供您要求的尺寸。谢谢 – 2011-04-06 09:22:46

0

你应该看看Itamar Katz的建议。

我想添加以下内容:我认为问题的核心(对于你的问题)是你不明白在MATLAB中你不能连接不同大小的矩阵。

例如下面是无效:零(5,5),一(4,4)]

如果你尝试,你会得到正是你得到同样的错误。

矩阵(:)运算符(请参阅Itemar的答案)将其转换为一维数组,因此可以连接许多事物。

作为一个建议,我花了几个小时才真正理解MATLAB中的矩阵。然后,您可以更有效地推进您的工作。

+0

如果我不能连接不同大小的矩阵,我如何添加筛选特征描述符到我的特征。在我训练图像之前,我没有使用这个筛选特征描述符,并且训练得很好。即使我没有使用单元阵列b',因为所有的特征都只有1x1的双倍值。但是,现在我想将这个筛选描述符添加到我的特征文件中。根据从sift算法返回的关键点,它会转到多行,但对于一个图像的其他特征,只有一行存在。有什么办法可以将这个筛选特征放到一行中吗? – 2011-04-06 09:44:46

+0

可以总结特定列的所有行中的值从筛选返回。那么对于那个专栏我只能有一行?如果我这样做,筛选工作的功能会不会好?我对matlab没有太多的了解。你能帮我吗? – 2011-04-06 09:47:39