深度学习——模型评价篇
Yang Li Lv1

1.测试集准确率的计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 保存模型
PATH = './NIR.pth'
torch.save(network.state_dict(), PATH)
# 加载模型
network = Network()
network.load_state_dict(torch.load(PATH))

@torch.no_grad()
def get_all_preds(model, loader):
all_preds = torch.tensor([])
print(len(loader))
for batch in loader:
images, labels = batch

preds = model(images)
all_preds = torch.cat((all_preds, preds) ,dim=0)

return all_preds

test_preds = get_all_preds(network, test_loader)
actual_labels_test = torch.Tensor(test_data.labels)
preds_correct_test = test_preds.argmax(dim=1).eq(actual_labels_test).sum().item()

print('total correct:', preds_correct_test)
print('accuracy_test:', preds_correct_test / len(test_data))

这里注意一个问题,我想知道我在训练集上的模型准确率,直接按照accuracy_test的计算方式进行计算,我适用的是train_data.laber。但是这里我发现,因为我设置了batch_size为16,而数据总数是415,所以我发现在经过batch_size后,我的train_loader为25个batch_size,即为400个,train_data为415,这个就是在batch_size无法整除数据时所造成的问题。

那么从另一个点上也就是说,我实际上只有400个数据参与了模型训练,而不是415个。

2.输出最后一层的预测概率

调整输出的灵敏度和特异度的时候需要调整预测概率。验证集的训练方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@torch.no_grad()
def get_all_preds(model, loader):
all_preds = torch.tensor([])
for batch in loader:
images, labels = batch

preds = model(images)
all_preds = torch.cat((all_preds, preds) ,dim=0)

return all_preds

test_preds = get_all_preds(network, test_loader)
actual_labels_test = torch.Tensor(test_data.labels)
preds_correct_test_list = []
#preds_correct_test = torch.softmax(test_preds,dim=0)[1][0].cpu().item()
for i in range(len(test_preds)):
# preds_correct_test_list.append(torch.softmax(test_preds,dim=1)[i][0].cpu().item())
preds_correct_test_list.append(torch.softmax(test_preds,dim=1)[i][1].cpu().item())

3.手动计算灵敏度,特异度,准确率等参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 手动计算敏感度特异度
sum_number_0 = 0
sum_number_1 = 0
for i in range(len(preds_correct_test_list)):
# 输入调整的概率
if preds_correct_test_list[i] > 0.00000000005:
preds_correct_test_list[i] = 1
else:
preds_correct_test_list[i] = 0

TP,TN,FP,FN = 0,0,0,0
for i in range(len(test_loader.dataset.labels)):
if (test_loader.dataset.labels[i]==0) and (preds_correct_test_list[i]==0):
TP += 1
if (test_loader.dataset.labels[i]==0) and (preds_correct_test_list[i]==1):
FN += 1
if (test_loader.dataset.labels[i]==1) and (preds_correct_test_list[i]==0):
FP += 1
if (test_loader.dataset.labels[i]==1) and (preds_correct_test_list[i]==1):
TN += 1

accuracy = (TP+TN)/(TP+TN+FP+FN)
precision = TP/(TP+FP)
# 敏感度特异度
sensitivity = TP/(TP+FN)
specificity = TN/(TN+FP)
print(accuracy,precision,sensitivity,specificity)

4.画一个matrix图,展示正确时错误的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 画一个matrix图展示正确和错误的数据
import itertools
import numpy as np
import matplotlib.pyplot as plt

def plot_confusion_matrix(cm, classes,
normalize=False,
title='Confusion matrix',
cmap=plt.cm.Blues):
"""
This function prints and plots the confusion matrix.
Normalization can be applied by setting `normalize=True`.
"""
if normalize:
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
print("Normalized confusion matrix")
else:
print('Confusion matrix, without normalization')

print(cm)

plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)

fmt = '.2f' if normalize else 'd'
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, format(cm[i, j], fmt),
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")

plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')

cm = confusion_matrix(test_data.labels, test_preds.argmax(dim=1))
classes = ('0','1')
plt.figure(figsize=(10,10))
plot_confusion_matrix(cm, classes)

5.画LOSS曲线图

最简单的一种方法

1
2
3
plt.plot(loss_list)
plt.legend()
plt.title('Compare loss for different models in training')

将LOSS和ACC画到一起的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from mpl_toolkits.axes_grid1 import host_subplot
def plot_acc_loss(loss, acc):
host = host_subplot(111) # row=1 col=1 first pic
plt.subplots_adjust(right=0.8) # ajust the right boundary of the plot window
par1 = host.twinx() # 共享x轴

# set labels
host.set_xlabel("steps")
host.set_ylabel("train-loss")
par1.set_ylabel("train-accuracy")

# plot curves
p1, = host.plot(range(len(loss)), loss, label="loss")
#p2, = par1.plot(range(len(acc)), acc, label="accuracy")

# set location of the legend,
# 1->rightup corner, 2->leftup corner, 3->leftdown corner
# 4->rightdown corner, 5->rightmid ...
host.legend(loc=5)

# set label color
host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())

# set the range of x axis of host and y axis of par1
# host.set_xlim([-200, 5200])
# par1.set_ylim([-0.1, 1.1])

plt.draw()
plt.show()

plot_acc_loss(loss_list, acc_list)
  • Post title:深度学习——模型评价篇
  • Post author:Yang Li
  • Create time:2022-08-15 21:12:00
  • Post link:https://yangli-os.github.io//2022/08/15/深度学习-模型评估篇/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments