首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分割为one-hot编码

分割为one-hot编码
EN

Stack Overflow用户
提问于 2021-01-09 06:04:55
回答 1查看 195关注 0票数 0

我有一批大小的分割图像

seg --> [batch, channels, imsize, imgsize] --> [16, 6, 50, 50]

该张量中的每个标量指定一个分割类。我们有2000总分割类。

现在的目标是转换[16, 6, 50, 50] --> [16, 2000, 50, 50],其中每个类都以一种热门的方式进行编码。

如何使用pytorch api完成此操作?我只能想到非常低效的循环构造。

示例

这里我们将只有2个初始通道(而不是6个),4个标签(而不是2000个),大小为1号(而不是16个)和4x4图像而不是50x50。

代码语言:javascript
复制
0, 0, 1, 1
0, 0, 0, 1
1, 1, 1, 1
1, 1, 1, 1

3, 3, 2, 2
3, 3, 2, 2
3, 3, 2, 2
3, 3, 2, 2

现在,这变成了4通道输出

代码语言:javascript
复制
1, 1, 0, 0
1, 1, 1, 0
0, 0, 0, 0
0, 0, 0, 0

0, 0, 1, 1
0, 0, 0, 1
1, 1, 1, 1
1, 1, 1, 1

1, 1, 0, 0
1, 1, 0, 0
1, 1, 0, 0
1, 1, 0, 0

0, 0, 1, 1
0, 0, 1, 1
0, 0, 1, 1
0, 0, 1, 1

关键的观察结果是,特定的标签只出现在单个输入通道上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-09 07:20:30

我认为你可以毫不费力地做到这一点。构建与标签数量一样多的蒙版,然后将这些蒙版堆叠在一起,在通道层上求和并转换为浮点数:

代码语言:javascript
复制
>>> x
tensor([[[0, 0, 1, 1],
         [0, 0, 0, 1],
         [1, 1, 1, 1],
         [1, 1, 1, 1]],

        [[3, 3, 2, 2],
         [3, 3, 2, 2],
         [3, 3, 2, 2],
         [3, 3, 2, 2]]])

>>> y = torch.stack([x==i for i in range(x.max()+1)], dim=1).sum(dim=2)
tensor([[[1., 1., 0., 0.],
         [1., 1., 1., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

        [[0., 0., 1., 1.],
         [0., 0., 0., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[0., 0., 1., 1.],
         [0., 0., 1., 1.],
         [0., 0., 1., 1.],
         [0., 0., 1., 1.]],

        [[1., 1., 0., 0.],
         [1., 1., 0., 0.],
         [1., 1., 0., 0.],
         [1., 1., 0., 0.]]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65637015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档