我正在进行硕士论文,研究超分辨率算法对AlexNet图像标注准确率的影响。我使用的是Matlab和预训练的AlexNet版本。
问题是,使用
[label, scores] = classify(net, 'image')
我只能得到一个标签,而我希望得到多个标签,比如五个,以及AlexNet对应的得分。
我不知道如何做到这一点,如果有人能给我一点提示,我将非常感激。
回答:
scores
矩阵会告诉你每个类别在分类数据时的得分情况。具体来说,每列i
会告诉你第i
个类别在尝试以类别i
分类输入时的得分情况。每行对应AlexNet的一个输入。
如果你想获取每个输入的前k
个得分,你可以使用sort
– 特别是查看第二个输出变量,并单独对每行进行排序。之后,你可以提取结果的前k
列,这将告诉你与输入相关联的前5个类别或标签。如果你关心实际的类别,请查看第一个输出。
% 首先对你想要的图像进行分类[label, scores] = classify(net, ...);k = 5; % 我们想要5个类别[scores_sorted, classes] = sort(scores, 2); % 单独对每行排序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个元素。因此,根据我上面写的代码中的classes
变量,你可以这样做:
out = net.Layers(end).ClassNames(classes);
classes
将用于索引到单元数组中,因此它将为你提供一个N x k
的单元数组,其中该单元数组的每一行告诉你AlexNet为每个输入图像分配的前k
个类别的标签。