1、numpy之argmax()作用
返回相应维度axis上的最大值的位置。
2、具体应用
深度学习图像分割多分类最后是softmax得分结果,我们需要将这个浮点型的结果保存成整型的标签图像,这样才算完成图像分割。softmax结果转成标签的过程就需要numpy的argmax()方法。
来一个具体案例,假设我们的softmax输出的得分结果是(2,2,3)的矩阵,如下图,2行2列的图像,里面有3个类别。
那么我们要转化成对应的标签应该是
我们来看看numpy的argmax是怎么工作的。
首先需要说明一点,当通道顺序在最后时,图1中在numpy表示的形式是:
softmax_score=np.array([[[0.8,0.1,0.1],[0.2,0.7,0.1]],[[0.05,0.05,0.9],[0.7,0.2,0.1]]])
print(sofmax_score)
label=softmax_score.argmax(axis=2)
print(label)
下面具体来分析下argmax的计算思路。
首先我用的keras的backend是tensorflow,所以通道是在最后,(2,2,3)表明是2行2列,然后是3类。这里需要很清楚numpy中的axis参数,最重要的是理解每一层[]对应一个维度。
再来看argmax(axis=2)中的axis=2,表明是对第三层[]内的数据进行最大值位置判断。
来看softmax_socre的第三层[]里面都有啥,分别是[0.8,0.1,0.1]、[0.2,0.7,0.1]、[0.05,0.05,0.9]、[0.7,0.2,0.1]。argmax()方法就是返回最大值的位置,[0.8,0.1,0.1]中最大值为0.8,在第0个位置,返回为0,同理[0.2,0.7,0.1]最大值是第1位的0.7,返回为1,[0.05,0.05,0.9]返回2,[0.7,0.2,0.1]返回0。
那么接下来该咋组合呢?我的博客里有介绍,numpy在某一轴上做完计算后会删除这一层的[],保留其他的[],所以有下面的过程
[[[0.8 , 0.1 , 0.1 ],
[0.2 , 0.7 , 0.1 ]],
[[0.05, 0.05, 0.9 ],
[0.7 , 0.2 , 0.1 ]]]
在第三层[]里面进行计算判断,初步结果
[[[0],
[1 ]],
[[2 ],
[0]]]
然后删除第三层的[]
[[0,
1 ],
[2 ,
0]]
这就是我们想要的结果
[[0,1],
[2,0]]
这就是最终想要的标签结果
注意
1、这里有个点容易混淆,就是通道的位置,有的是在前比如theano,有的是在后比如tensorflow。还拿上面的例子说明通道在前的情况,
通道在前时,数据在numpy的表示为
channel_first=np.array([[[0.8,0.2],[0.05,0.7]],[[0.1,0.7],[0.05,0.2]],[[0.1,0.1],[0.9,0.1]]])
print(channel_first.shape)
label = channel_first.argmax(axis=0)
由于通道在前,所以这里argmax的axis=0。