所以,我正在做我的硕士论文,关于超分辨率算法对AlexNet图像标记准确率的影响。我正在使用Matlab和预先训练的AlexNet版本。
问题在于,使用
[label, scores] = classify(net, 'image')
我只获得一个标签,而我想获得多个标签,例如五个,以及AlexNet的相应分数。
我不知道怎么做,如果有人能给我,至少是一个提示,真的会非常感激。
答案 0 :(得分:2)
scores
矩阵告诉您在分类数据时每个类的得分情况。具体来说,每个列i
都会告诉您在尝试使用类i
对输入进行分类时,i
类的得分是如何得分的。每行都是AlexNet的一个输入。
如果您想获得每个输入的最高k
分数,您可以sort
- 特别查看第二个输出变量并单独对每一行进行排序。之后,您可以提取结果的第一个k
列,它们会告诉您与输入关联的前5个类或标签。如果您关注实际的类,请查看第一个输出。
% First classify the image(s) you would like
[label, scores] = classify(net, ...);
k = 5; % We want 5 classes
[scores_sorted, classes] = sort(scores, 2); % Sort each row individually
scores_sorted = scores_sorted(:, 1 : k);
classes = classes(:, 1 : k);
scores_sorted
和classes
现在会为您提供k
列矩阵,其中每一行都会告诉您为每个输入分配的顶级k
类(存储在classes
中)以及AlexNet(scores_sorted
)提供的分数。
要最终确定实际的类是什么,在创建AlexNet时,最后一层具有分类类别。假设您创建了默认网络:
net = alexnet;
...您可以通过以下方式确定每个标签ID的类别:
c = net.Layers(end).ClassNames;
这是一个类的单元格数组,总共应该有1000个元素。因此,根据我上面编写的代码中的类变量,您可以这样做:
out = net.Layers(end).ClassNames(classes);
因此, classes
将用于索引单元格数组,因此它将为您提供一个N x k
单元格数组,其中此单元格数组中的每一行都会告诉您AlexNet为顶部指定的标签每个输入图像k
个类。