max_class = max(labels); temp = zeros(length(labels),max_class); for i=1:num_train temp(i,:) = [zeros(1, labels(i)-1) 1 zeros(1,max_class - labels(i))]; end labels = temp; clear temp;
时间: 2024-04-08 18:36:03 浏览: 39
这段代码的作用是将类别标签`labels`转换为二元的成员矩阵。
首先,通过`max_class = max(labels)`找到标签中的最大值,即类别的数量。
然后,创建一个临时矩阵`temp`,其行数与`labels`的长度相同,列数为最大类别数。初始时,`temp`矩阵的所有元素都为零。
接下来,使用循环遍历每个训练样本。对于第`i`个训练样本,将`temp`矩阵的第`i`行中对应类别的位置设置为1,其他位置保持为零。具体操作是将一个全零向量中对应类别位置设置为1,通过`[zeros(1, labels(i)-1) 1 zeros(1,max_class - labels(i))]`来实现。
最后,将转换后的二元成员矩阵存储在`labels`中,并清除临时矩阵`temp`。
相关问题
all_scores = []; n_samples = length(labels); n_class = length(unique(labels)); K = length(W); scores = cell(K,1); max_scores = zeros(K, n_samples); tmp_label = zeros(K, n_samples); for j=1:K projected_X = X * W{j}; scores{j} = projected_X * Y; [max_scores(j,:),tmp_label(j,:)] = max(scores{j}'); end [best_scores,best_idx] = max(max_scores,[],1); label_idx = sub2ind(size(tmp_label), best_idx, 1:n_samples); predict_label = tmp_label(label_idx); %compute the confusion matrix label_mat = sparse(labels,1:n_samples,1,n_class,n_samples); predict_mat = sparse(predict_label,1:n_samples,1,n_class, n_samples); conf_mat = label_mat * predict_mat'; conf_mat_diag = diag(conf_mat); n_per_class = sum(label_mat'); %mean class accuracy mean_class_accuracy = sum(conf_mat_diag ./ n_per_class') / n_class; %per sample accuracy mean_sample_accuracy = sum(conf_mat_diag) / n_samples;
这段代码是用于计算分类任务中的混淆矩阵和准确率的。让我解释一下它的逻辑:
首先,定义了一些变量,包括得分列表(all_scores)、样本数量(n_samples)和类别数量(n_class),以及一个矩阵W的长度(K)。
然后,创建了一些空的变量,包括得分矩阵(scores)、最大得分矩阵(max_scores)和临时标签矩阵(tmp_label)。
接下来,通过将输入矩阵X乘以每个权重矩阵W{j}来计算投影矩阵projected_X。然后,将投影矩阵projected_X与标签矩阵Y相乘,得到每个类别的得分矩阵scores{j}。
对于每个得分矩阵scores{j},找到每个样本的最大得分和对应的标签,并将它们存储在max_scores(j,:)和tmp_label(j,:)中。
接下来,找到所有样本中最大得分的索引和对应的标签,并将它们存储在best_scores和best_idx中。
使用best_idx和1:n_samples作为索引,从tmp_label中提取预测标签。
接下来,根据真实标签和预测标签创建稀疏矩阵label_mat和predict_mat,并计算它们的乘积,得到混淆矩阵conf_mat。
通过从混淆矩阵的对角线上获取元素,得到每个类别的正确预测数量conf_mat_diag。
计算每个类别的样本数量n_per_class。
计算平均类别准确率,即将每个类别的正确预测数量除以该类别的样本数量,并将结果相加后除以类别数量。
计算平均样本准确率,即将混淆矩阵对角线上的元素相加后除以样本数量。
这段代码的目的是评估分类模型的准确率和混淆矩阵,其中平均类别准确率是针对每个类别的样本数量进行加权的准确率指标,而平均样本准确率是针对所有样本的准确率指标。
def test_mobilenet(): # todo 加载数据, 224*224的大小 模型一次训练16张图片 train_ds, test_ds, class_names = data_load(r"C:\Users\wjx\Desktop\项目\data\flower_photos_split\train", r"C:\Users\wjx\Desktop\项目\data\flower_photos_split\test", 224, 224, 16) # todo 加载模型 model = tf.keras.models.load_model("models/mobilenet_fv.h5") # model.summary() # 测试,evaluate的输出结果是验证集的损失值和准确率 loss, accuracy = model.evaluate(test_ds) # 输出结果 print('Mobilenet test accuracy :', accuracy) test_real_labels = [] test_pre_labels = [] for test_batch_images, test_batch_labels in test_ds: test_batch_labels = test_batch_labels.numpy() test_batch_pres = model.predict(test_batch_images) # print(test_batch_pres) test_batch_labels_max = np.argmax(test_batch_labels, axis=1) test_batch_pres_max = np.argmax(test_batch_pres, axis=1) # print(test_batch_labels_max) # print(test_batch_pres_max) # 将推理对应的标签取出 for i in test_batch_labels_max: test_real_labels.append(i) for i in test_batch_pres_max: test_pre_labels.append(i) # break # print(test_real_labels) # print(test_pre_labels) class_names_length = len(class_names) heat_maps = np.zeros((class_names_length, class_names_length)) for test_real_label, test_pre_label in zip(test_real_labels, test_pre_labels): heat_maps[test_real_label][test_pre_label] = heat_maps[test_real_label][test_pre_label] + 1 print(heat_maps) heat_maps_sum = np.sum(heat_maps, axis=1).reshape(-1, 1) # print(heat_maps_sum) print() heat_maps_float = heat_maps / heat_maps_sum print(heat_maps_float) # title, x_labels, y_labels, harvest show_heatmaps(title="heatmap", x_labels=class_names, y_labels=class_names, harvest=heat_maps_float, save_name="images/heatmap_mobilenet.png")
这段代码是用来测试 Mobilenet 模型在花卉数据集上的表现的。首先,使用 `data_load` 函数加载数据集,然后使用 `tf.keras.models.load_model` 函数加载预训练好的 Mobilenet 模型。接着,使用 `model.evaluate` 函数对测试集进行评估,得到测试集的损失值和准确率。然后,依次对测试集中的每一批数据进行预测,将真实标签和预测标签分别存储在两个列表中。最后,使用这两个列表生成混淆矩阵,并将混淆矩阵可视化为热力图。
阅读全文