es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función de activación por tramos.

Estoy tratando de escribir una función de activación por partes cuya pendiente entre -6 y 0 es 0.1 y en los demás lugares es uno.
Y el tamaño de entrada (X) es (B, C, H, W).
Así que llegué a la conclusión de que la mejor manera es el código de línea simple:

x[-6<x and x<0] = x[-6<x and x<0] * 0.1

Pero me enfrenté a este error:


RuntimeError: el valor booleano del Tensor con más de un valor es ambiguo

¿Hay alguna solución para resolver este error?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una solución a este problema. El error está ocurriendo porque la condición booleana se está aplicando a un Tensor con más de un valor, lo que lo hace ambiguo.

    Para resolver esto, puedes usar la función incorporada de PyTorch torch.where() para aplicar la condición a cada elemento del Tensor individualmente. Aquí te mostramos un ejemplo de cómo hacerlo:

    import torch
    
    def custom_activation(x):
        # la pendiente entre -6 y 0 es 0.1, de lo contrario es uno
        slope = torch.ones_like(x)
        slope[(x>-6) & (x<0)] = 0.1
    
        return x * slope
    
    # Ejemplo de uso
    input_tensor = torch.randn((2, 3, 4, 5))  # Forma: [tamaño_del_lote, canales, altura, ancho]
    output_tensor = custom_activation(input_tensor)
    

    En este ejemplo, creamos una función de activación personalizada custom_activation que toma un tensor de entrada x y devuelve un tensor de salida con la pendiente deseada entre -6 y 0. Definimos un tensor de pendiente slope del mismo tamaño que la entrada x, con valores de 1 excepto para los elementos que caen entre -6 y 0, que tienen un valor de 0,1. Luego, devolvemos el producto de elemento a elemento de la entrada x y la pendiente slope.

    Ten en cuenta que usamos el operador & para aplicar la condición booleana elemento por elemento y usamos .ones_like() para crear un tensor de unos con la misma forma que x. Además, es importante asegurarse de que el tensor de entrada x sea un torch.Tensor y no un arreglo numpy o python.

Comments are closed.