argmax经过sigmoid和不经过sigmoid区别

发布时间 2023-04-06 13:32:24作者: 九叶草

起因

今天和同组讨论了一下网络输出时,在torch.argmax之前经过torch.sigmoid和不经过sigmoid的区别。
主要起因是实验结果图像不同

img1

图1 不经过sigmoid

img2

图2 经过sigmoid

我们发现经过sigmoid预测的图像更加严格(实验结果证明,经过sigmoid效果好),会将一些不经过sigmoid预测的前景分为背景。

简单实现

#coding:utf-8
import torch
a = torch.tensor([
    [[8.0,5.0,-20000.0],[4.0,1.0,2.0],[1.0,6.0,7.0]],
    [[-6.0,11.0,-20000.0],[5.0,7.0,9.0],[8.0,9.0,10.0]],
    [[-6.0,10.0,-20001.0],[5.0,7.0,9.0],[8.0,9.0,10.0]]
])
b = torch.argmax(a,dim=0)
d = torch.sigmoid(a)
print("as:\n",d)
ds = torch.argmax(d,dim=0)
print("没经过sig:\n{}".format(b))
print("经过sig:\n{}".format(ds))
  • 结果
as:
 tensor([[[0.9997, 0.9933, 0.0000],
         [0.9820, 0.7311, 0.8808],
         [0.7311, 0.9975, 0.9991]],

        [[0.0025, 1.0000, 0.0000],
         [0.9933, 0.9991, 0.9999],
         [0.9997, 0.9999, 1.0000]],

        [[0.0025, 1.0000, 0.0000],
         [0.9933, 0.9991, 0.9999],
         [0.9997, 0.9999, 1.0000]]])
没经过sig:
tensor([[0, 1, 1],
        [2, 2, 2],
        [2, 2, 2]])
经过sig:
tensor([[0, 1, 2],
        [2, 2, 2],
        [2, 2, 2]])
  • 我们可以发现其中-20000.0,-20000.0,-20001.0分别出现在第1,2,3通道上。但是由于经过sigmoid,我们看到as结果都为0,所以导致我们最终argmax最大索引到2通道。但是如果我们不经过sigmoid,发现argmax最大索引是1。这也就证实了上面两张预测图为什么会不一样。