1、numpy之argmax()作用

返回相应维度axis上的最大值的位置。

2、具体应用

深度学习图像分割多分类最后是softmax得分结果,我们需要将这个浮点型的结果保存成整型的标签图像,这样才算完成图像分割。softmax结果转成标签的过程就需要numpy的argmax()方法。
来一个具体案例,假设我们的softmax输出的得分结果是(2,2,3)的矩阵,如下图,2行2列的图像,里面有3个类别。

python arima模型自动选阶数_tensorflow


那么我们要转化成对应的标签应该是

python arima模型自动选阶数_数据_02


我们来看看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)

python arima模型自动选阶数_python arima模型自动选阶数_03


由于通道在前,所以这里argmax的axis=0。