Sé que PyTorch no tiene una función similar a map para aplicar una función a cada elemento de un tensor. Entonces, ¿podría hacer algo como lo siguiente sin una función similar a map en PyTorch?

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

Esto funcionaría si los tensores fueran 1D. Sin embargo, necesito que esto funcione cuando tensor_b es 2D (tensor_a debe ser unsqueeze d en la declaración return). Esto significa que se debe devolver un tensor 2D donde algunas de las filas serán vectores 0.

Feliz de utilizar las últimas funciones de la versión más reciente de Python.

1
at. 23 ene. 2021 a las 04:51

1 respuesta

La mejor respuesta

Si lo entiendo correctamente, está buscando devolver un tensor de cualquier manera (de ahí el mapeo) pero verificando la condición por elementos. Suponiendo que las formas de tensor_a, tensor_b y tensor_c son todas bidimensionales, como en "matrices simples", aquí hay una posible solución.

Lo que está buscando probablemente sea torch.where, está bastante cerca de un mapeo donde, basado en una condición, devolverá un valor u otro elemento-sabio .

Funciona como torch.where(condition, value_if, value_else) donde los tres tensores tienen la misma forma (value_if y value_else pueden ser flotadores que se convertirán en tensores, llenados con el mismo valor). Además, condition es un tensor bool que define qué valor asignar al tensor generado: es una máscara booleana.

Para el propósito de este ejemplo, he usado tensores aleatorios:

>>> 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)

Sin embargo, de manera más general, esto funcionará si tensor_a y tensor_b tienen una forma de (m, n), y tensor_c tiene una forma de (n, m) debido a las restricciones de la operación. En su experimento, supongo que solo tenía columnas.

0
Ivan 23 ene. 2021 a las 08:46