|
- import numpy as np
- import torch.nn as nn
-
-
- # 计算准确率
- def classes_two_acc(records):
- tp_num, tn_num, fp_num, fn_num = 0, 0, 0, 0
- for record in records:
- assert record[0].shape == record[1].shape
- for idx in range(record[0].shape[0]):
- if record[0][idx] == record[1][idx]:
- tp_num += 1
- if record[0] > 0.5 and record[1] == 1:
- tp_num += 1
- elif record[0] < 0.5 and record[1] == 0:
- tn_num += 1
- elif record[0] < 0.5 and record[1] == 1:
- fp_num += 1
- elif record[0] > 0.5 and record[1] == 0:
- fn_num += 1
-
- return (tp_num + tn_num) / (tp_num + tn_num + fp_num + fn_num)
-
-
- def classes_multiple_acc(records, num_classes=7):
- # 计算准确率和召回率的混淆矩阵, 行为label, 列为prediction
- # https://www.zhihu.com/question/56403549
- conf_matrix = np.zeros((num_classes, num_classes), dtype=np.int32)
- for record in records:
- pred_classes = record[0].argmax(1)
- label_classes = record[1]
- # 当 label_classes 是 one_hot 向量时, 才需进行转换为类别值
- if pred_classes.shape != label_classes.shape:
- # label_classes = np.array(np.argmax(record[1], axis=1), dtype=np.uint8)
- label_classes = label_classes.argmax(1)
- for pred_class, label_class in zip(pred_classes, label_classes):
- conf_matrix[label_class][pred_class] += 1
- # axis=0 按列求和, axis=1 按行求和
- accurate_array = np.sum(conf_matrix, axis=0)
- # recall_array = np.sum(conf_matrix, axis=1)
- acc_sum, recall_sum = 0, 0
- for num_class in range(num_classes):
- if accurate_array[num_class] == 0:
- continue
- else:
- acc_sum += conf_matrix[num_class][num_class] / accurate_array[num_class]
- # recall_sum += conf_matrix[num_class][num_class] / recall_array[num_class]
- return round(acc_sum / num_classes, 4)
-
-
- def weight_init(m):
-
- if isinstance(m, nn.Linear):
- nn.init.xavier_normal_(m.weight)
- nn.init.constant_(m.bias, 0)
- elif isinstance(m, nn.Conv3d):
- nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
- elif isinstance(m, nn.BatchNorm3d):
- nn.init.constant_(m.weight, 1)
- nn.init.constant_(m.bias, 0)
|