【问题标题】:Conditionally apply tensor operations in PyTorch在 PyTorch 中有条件地应用张量操作
【发布时间】:2021-04-27 11:59:15
【问题描述】:

我知道 PyTorch 没有类似 map 的函数来将函数应用于张量的每个元素。那么,如果 PyTorch 中没有类似 map 的函数,我可以执行以下操作吗?

if tensor_a * tensor_b.matmul(tensor_c) < 1:
    return -tensor_a*tensor_b
else:
    return 0

如果张量是一维的,这将起作用。但是,当tensor_b 是2D(tensor_a 需要在return 语句中为unsqueezed)时,我需要它来工作。这意味着应该返回一个二维张量,其中一些行将是0 向量。

乐于使用最新 Python 版本的最新功能。

【问题讨论】:

    标签: python python-3.x pytorch tensor


    【解决方案1】:

    如果我理解正确,您希望以任何一种方式(因此映射)返回张量,但通过逐个检查条件来返回。假设tensor_atensor_btensor_c 的形状都是二维的,如在“简单矩阵”中,这是一个可能的解决方案。

    您正在寻找的可能是torch.where,它非常接近于基于条件的映射,它将返回一个值或另一个元素方式

    它的工作方式类似于torch.where(condition, value_if, value_else),其中所有三个张量具有相同的形状(value_ifvalue_else 实际上可以是浮点数,它们将被转换为张量,填充相同的值)。此外,condition 是一个 bool 张量,它定义了分配给输出张量的值:它是一个布尔掩码。

    出于本示例的目的,我使用了随机张量:

    >>> a = torch.rand(2, 2, dtype=float)*100
    >>> b = torch.rand(2, 2, dtype=float)*0.01
    >>> c = torch.rand(2, 2, dtype=float)*10
    
    >>> torch.where(a*(b@c) < 1, -a*b, 0.)
    tensor([[ 0.0000,  0.0000],
            [ 0.0000, -0.0183]], dtype=torch.float64)
    

    更一般地说,如果tensor_atensor_b 的形状为(m, n),并且tensor_c 的形状为(n, m),则由于操作限制,这将起作用。在你的实验中,我猜你只有列。

    【讨论】:

    • 这行得通,谢谢。但我不确定它的效率如何。即使a*(b@c) &gt;= 1(我喜欢@ 运算符),是否会为每个元素计算-a*b?在某些情况下,这对我来说可能是个问题。在这种特殊情况下,条件将比-a*b 更有效。
    • 所有参数在传递给函数之前都会被评估,所以-a*b 被计算一次,然后由torch.where 使用,如果这就是你要问的。张量 a*(b@c) &lt; 1 相同。
    • 是的,这就是我要问的。希望得到一个答案,除非条件为真,否则不会评估 -a*b。我最终只是简单地将条件向量乘以二维矩阵,而不是使用torch.where,但你的答案也可以。
    • 你的意思是只计算元素(-a*b)[i, j] 其中(a*(b@c) &lt; 1)[i, j]true
    • 是的,但只有第 i 行。 a*(b@c)
    猜你喜欢
    • 2022-08-18
    • 2020-12-06
    • 2020-10-21
    • 2022-06-19
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多