将填充有n
值的形状张量(批次大小、高度、宽度)转换为形状张量(批次大小、n、高度、宽度)的最简单方法是什么?
我在下面创建了一个解决方案,但看起来有更简单、更快的方法
def batch_tensor_to_onehot(tnsr, classes):
tnsr = tnsr.unsqueeze(1)
res = []
for cls in range(classes):
res.append((tnsr == cls).long())
return torch.cat(res, dim=1)
Tags:
您可以使用torch.nn.functional.one_hot
对于您的情况:
您也可以使用^{} ,它避免了
.permute
,但可以说比@Alpha提出的简单方法更难理解基准测试结果
我很好奇,决定对这三种方法进行基准测试。我发现提议的方法在批次大小、宽度或高度方面似乎没有明显的相对差异。主要是班级数量是区别因素。当然,与任何基准里程一样,里程可能会有所不同
使用随机指数和批次大小、高度、宽度=100收集基准。每个实验重复20次,报告平均值。num_classes=100实验在热身分析之前运行一次
CPU结果表明,对于小于30的num_类,原始方法可能是最好的,而对于GPU,
scatter_
方法似乎是最快的在Ubuntu 18.04、NVIDIA 2060 Super、i7-9700K上执行的测试
用于基准测试的代码如下所示:
相关问题 更多 >
编程相关推荐