|
- import numpy as np
- from mindspore.train.callback import Callback
-
- import config as cfg
-
-
- def validate(output, label):
- ret = [0] * 8
- # [one_num, two_num, three_num, num_corr, one_corr, two_corr, three_corr, label_corr]
-
- num_pred = np.argmax(output[:3]) + 1
- num_gt = np.argmax(label[:3]) + 1
- ret[num_gt - 1] = 1
- if num_pred == num_gt:
- ret[3] = 1
- ret[num_gt + 3] = 1
- position_pred = np.argpartition(output[3:], kth=-num_pred)[-num_pred:]
- position_gt = np.argpartition(label[3:], kth=-num_gt)[-num_gt:]
- if np.array_equal(position_gt, position_pred):
- ret[7] = 1
-
- a = np.zeros(6)
- for i in range(6):
- if output[i+3]>0:
- a[i]=1
- if np.array_equal(a, label[3:]):
- another = 1
- else:
- another = 0
- return ret, another
-
-
- class EvaluateCallBack(Callback):
- def __init__(self, model, val_ds, train_ds):
- super(EvaluateCallBack, self).__init__()
- self.model = model
- self.val_ds = val_ds
- self.train_ds = train_ds
-
- def epoch_end(self, run_context):
- self.model.set_train(False)
- total_num = 0
- one_num = 0
- two_num = 0
- three_num = 0
- num_corr = 0 # 类别数目完全预测正确的个数
- one_corr = 0 # 对于属于一类的样本,模型预测类别数目正确的个数
- two_corr = 0 # 对于属于一类的样本,模型预测类别数目正确的个数
- three_corr = 0 # 对于属于三类的样本,模型预测类别数目正确的个数
- label_corr = 0 # 完全预测正确的个数
- an_corr = 0
- for item in self.val_ds.create_dict_iterator(num_epochs=1):
- images = item['image']
- label = item['label'].asnumpy()
- output = self.model(images).asnumpy()
- num = label.shape[0]
- total_num += num
- for i in range(num):
- [one_num_cr, two_num_cr, three_num_cr, num_corr_cr, one_corr_cr, two_corr_cr, three_corr_cr, label_corr_cr], an_corr_cr = validate(output[i], label[i])
- one_num += one_num_cr
- two_num += two_num_cr
- three_num += three_num_cr
- num_corr += num_corr_cr
- one_corr += one_corr_cr
- two_corr += two_corr_cr
- three_corr += three_corr_cr
- label_corr += label_corr_cr
- an_corr += an_corr_cr
- print('类别数目预测精度为:%.2f%%' % (num_corr / total_num * 100))
- print('对于属于一类样本的类别数目预测精度为:%.2f%%' % (one_corr / one_num * 100))
- print('对于属于两类样本的类别数目预测精度为:%.2f%%' % (two_corr / two_num * 100))
- print('对于属于三类样本的类别数目预测精度为:%.2f%%' % (three_corr / three_num * 100))
- print('预测完全正确的比例为:%.2f%%' % (label_corr / total_num * 100))
- print('另一种方式预测完全正确的比例为:%.2f%%' % (an_corr / total_num * 100))
- cfg.acc_val_iter.append(label_corr / total_num)
-
- total_num = 0
- one_num = 0
- two_num = 0
- three_num = 0
- num_corr = 0 # 类别数目完全预测正确的个数
- one_corr = 0 # 对于属于一类的样本,模型预测类别数目正确的个数
- two_corr = 0 # 对于属于一类的样本,模型预测类别数目正确的个数
- three_corr = 0 # 对于属于三类的样本,模型预测类别数目正确的个数
- label_corr = 0 # 完全预测正确的个数
- an_corr = 0
- for item in self.train_ds.create_dict_iterator(num_epochs=1):
- images = item['image']
- label = item['label'].asnumpy()
- output = self.model(images).asnumpy()
- num = label.shape[0]
- total_num += num
- for i in range(num):
- [one_num_cr, two_num_cr, three_num_cr, num_corr_cr, one_corr_cr, two_corr_cr, three_corr_cr, label_corr_cr], an_corr_cr = validate(output[i], label[i])
- one_num += one_num_cr
- two_num += two_num_cr
- three_num += three_num_cr
- num_corr += num_corr_cr
- one_corr += one_corr_cr
- two_corr += two_corr_cr
- three_corr += three_corr_cr
- label_corr += label_corr_cr
- an_corr += an_corr_cr
- print('类别数目预测精度为:%.2f%%' % (num_corr / total_num * 100))
- print('对于属于一类样本的类别数目预测精度为:%.2f%%' % (one_corr / one_num * 100))
- print('对于属于两类样本的类别数目预测精度为:%.2f%%' % (two_corr / two_num * 100))
- print('对于属于三类样本的类别数目预测精度为:%.2f%%' % (three_corr / three_num * 100))
- print('预测完全正确的比例为:%.2f%%' % (label_corr / total_num * 100))
- print('另一种方式预测完全正确的比例为:%.2f%%' % (an_corr / total_num * 100))
- cfg.acc_train_iter.append(label_corr / total_num)
|