1. 布尔索引
布尔值可以作为索引。例如对于一个data中存放着小王,小张和小李的数学、语文和英语成绩:
1 2 3 4 5
| import numpy as np data = [[100,99,98], [97,96,95], [94,93,92]] data = np.array(data)
|
如果想切片得到小张和小李的所有科目的成绩,可以使用布尔索引。首先定义一个布尔索引矩阵bool_index:
1 2 3 4
| bool_index = [False, True, True] bool_index = np.array(bool_index)
|
然后将bool_index作为data矩阵的索引:
则True位置对应的元素将会被保存,输出为一个两行三列的矩阵:array([[100, 99, 98],[ 97, 96, 95]])
。
1 2 3 4
| names = ["Wang","Zhang","Li"] names = np.array(names)
data[names=="Zhang",names=="Li"]
|
参考:【Python与科学研究】2.6 布尔索引
2. 代码分析
孪生神经网络中计算精度的代码:
1 2
| def compute_accuracy(predictions, labels): return labels[predictions.ravel() < 0.5].mean()
|
predictions和labels是预测矩阵和标签矩阵,在标签矩阵中三组Genuine图片记作1,两组Imposite图片记作0。
-
假设predictions和labels为:
predictions=⎣⎡[0.1],[0.2],[0.3],[0.7],[0.8]⎦⎤,labels=⎣⎡1,0,1,1,0⎦⎤
-
preditions.ravel() 展开之后就变为:
predictions.ravel()=⎣⎡0.1,0.2,0.3,0.7,0.8⎦⎤
-
predictions.ravel() < 0.5条件判断,返回布尔索引矩阵:
predictions.ravel()<0.5=⎣⎡True,True,True,False,False⎦⎤
-
labels[predictions.ravel() < 0.5]使用布尔索引矩阵作为索引,返回True对应索引处的元素(即返回神经网络认为Genuine==True的图片组):
labels[predictions.ravel()<0.5]=⎣⎡1,0,1⎦⎤
-
目前矩阵中的元素都是神经网络认为是Genuine的图片组。他们的真实标签要么是0,要么是1。所以只要对他们求平均值,就可以知道神经网络预测Genuine的成功率。求平均:labels[predictions.ravel() < 0.5].mean() = 0.66,也就是说正确率为0.66。
3. 总结
这个compute_accuracy算法根本就不关心神经网络对于Imposite图片组识别的成功率,而是只计算了对于Genuine图片组识别的成功率。