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矩阵的索引:

1
data[bool_index]

​ 则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。

  • 假设predictionslabels为:

    predictions=[[0.1],[0.2],[0.3],[0.7],[0.8]],labels=[1,0,1,1,0]predictions =\left[ \begin{matrix} [0.1],\\ [0.2],\\ [0.3],\\ [0.7],\\ [0.8] \end{matrix} \right], labels = \left[ \begin{matrix} 1,\\ 0,\\ 1,\\ 1,\\ 0 \end{matrix} \right]

  • preditions.ravel() 展开之后就变为:

    predictions.ravel()=[0.1,0.2,0.3,0.7,0.8]predictions.ravel() =\left[ \begin{matrix} 0.1,\\ 0.2,\\ 0.3,\\ 0.7,\\ 0.8 \end{matrix} \right]

  • predictions.ravel() < 0.5条件判断,返回布尔索引矩阵:

    predictions.ravel()<0.5=[True,True,True,False,False]predictions.ravel()<0.5 =\left[ \begin{matrix} True,\\ True,\\ True,\\ False,\\ False \end{matrix} \right]

  • labels[predictions.ravel() < 0.5]使用布尔索引矩阵作为索引,返回True对应索引处的元素(即返回神经网络认为Genuine==True的图片组):

    labels[predictions.ravel()<0.5]=[1,0,1]labels[predictions.ravel() < 0.5] =\left[ \begin{matrix} 1,\\ 0,\\ 1\\ \end{matrix} \right]

  • 目前矩阵中的元素都是神经网络认为是Genuine的图片组。他们的真实标签要么是0,要么是1。所以只要对他们求平均值,就可以知道神经网络预测Genuine的成功率。求平均:labels[predictions.ravel() < 0.5].mean() = 0.66,也就是说正确率为0.66。

3. 总结

这个compute_accuracy算法根本就不关心神经网络对于Imposite图片组识别的成功率,而是只计算了对于Genuine图片组识别的成功率。