训练模型时遇到索引超出矩阵维度的问题

我在使用Felzenszwalb、D. McAllester、D. Ramaman及其团队开发的基于PASCAL开发工具包的判别式训练可变形部件模型系统进行模型训练时遇到了问题,该系统是用Matlab实现的。

当我尝试使用10张正样本和10张负样本图像训练一个“猫”的单组件模型时,出现了以下错误输出。

Error:??? Index exceeds matrix dimensions.Error in ==> pascal_train at 48models{i} = train(cls, models{i}, spos{i}, neg(1:maxneg),0, 0, 4, 3, ...Error in ==> pascal at 28model = pascal_train(cls, n, note);

这是pascal_train文件的内容

function model = pascal_train(cls, n, note)% model = pascal_train(cls, n, note)% 使用PASCAL数据集训练一个具有2*n组件的模型。% note允许您保存训练模型的注释% 示例:note = 'testing FRHOG (FRobnicated HOG)% 在训练过程中的每个“检查点”,我们将RNG的种子重置为固定值,以便实验结果可重现。initrand();if nargin < 3  note = '';endglobals; [pos, neg] = pascal_data(cls, true, VOCyear);% 根据纵横比将数据分成n组spos = split(cls, pos, n);cachesize = 24000;maxneg = 200;% 使用变形的正样本和随机负样本训练根过滤器try  load([cachedir cls '_lrsplit1']);catch  initrand();  for i = 1:n    % 将数据分为两组:左向和右向实例    models{i} = initmodel(cls, spos{i}, note, 'N');    inds = lrsplit(models{i}, spos{i}, i);    models{i} = train(cls, models{i}, spos{i}(inds), neg, i, 1, 1, 1, ...                      cachesize, true, 0.7, false, ['lrsplit1_' num2str(i)]);  end  save([cachedir cls '_lrsplit1'], 'models');end% 使用潜在检测和难负样本训练根左向和右向根过滤器try  load([cachedir cls '_lrsplit2']);catch  initrand();  for i = 1:n    models{i} = lrmodel(models{i});    models{i} = train(cls, models{i}, spos{i}, neg(1:maxneg), 0, 0, 4, 3, ...                      cachesize, true, 0.7, false, ['lrsplit2_' num2str(i)]);  end  save([cachedir cls '_lrsplit2'], 'models');end% 合并模型并使用潜在检测和难负样本进行训练try   load([cachedir cls '_mix']);catch  initrand();  model = mergemodels(models); 48:   model = train(cls, model, pos, neg(1:maxneg), 0, 0, 1, 5, ...                cachesize, true, 0.7, false, 'mix');save([cachedir cls '_mix'], 'model');end% 添加部件并使用潜在检测和难负样本更新模型try   load([cachedir cls '_parts']);catch  initrand();  for i = 1:2:2*n    model = model_addparts(model, model.start, i, i, 8, [6 6]);  end  model = train(cls, model, pos, neg(1:maxneg), 0, 0, 8, 10, ...                cachesize, true, 0.7, false, 'parts_1');  model = train(cls, model, pos, neg, 0, 0, 1, 5, ...                cachesize, true, 0.7, true, 'parts_2');  save([cachedir cls '_parts'], 'model');endsave([cachedir cls '_final'], 'model');

我已经标出了错误发生的代码行,在第48行。

我非常确定系统正确读取了用于训练的正负样本图像。我不知道这个错误发生在哪里,因为Matlab没有准确指出哪个索引超出了矩阵维度。

我已经尽可能整理了代码,如果我哪里做错了,请指导我。

有什么建议我应该从哪里开始查找问题吗?

好的,我尝试使用display来检查pascal_train中使用的变量;disp(i); disp(size(models)); disp(size(spos)); disp(length(neg)); disp(maxneg);

返回的结果是;

 1 1     1 1     110

200


回答:

我没有回答你的问题,但这里有一个建议,可能会帮助你自己调试这个问题。

在Matlab菜单中,转到调试->如果发生错误/警告时停止…并选择“总是停止如果发生错误(dbstop if error)”。现在再次运行你的脚本,这次当你遇到错误时,Matlab会像你在错误发生的行设置了断点一样停止。在那时,你可以使用整个工作空间,并检查所有变量和矩阵大小,以查看哪个变量导致了你看到的错误。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注