argmax经过sigmoid和不经过sigmoid区别

本文最后更新于:2023年4月5日 晚上

起因

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

图1 不经过sigmoid

图2 经过sigmoid

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

简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
#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))
  • 结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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]]])
    1
    2
    3
    4
    5
    6
    7
    8
    没经过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。这也就证实了上面两张预测图为什么会不一样。

打赏支持
“如果你觉得我的文章不错,不妨鼓励我继续写作。”

argmax经过sigmoid和不经过sigmoid区别
https://dreamoneyou.github.io/2023/argmax经过sigmoid和不经过sigmoid区别/
作者
九叶草
发布于
2023年4月5日
更新于
2023年4月5日
许可协议