Obtener rango de valores de Pytorch Tensor

Estoy tratando de conseguir una gama específica de valores de mi tensor de pytorch.

tensor=torch.tensor([0,1,2,3,4,5,6,7,8,9])
new_tensor=tensor[tensor>2]
print(new_tensor)

Esto me dará un tensor con escalares de 3-9

new_tensor2=tensor[tensor<8]
print(new_tensor2)

Esto me dará un tensor con escalares de 0-7

new_tensor3=tensor[tensor>2 and tensor<8]
print(new_tensor3)

Sin embargo esto plantea un error. ¿Sería capaz de conseguir un tensor con los valores de 3-7 usando algo así? Estoy tratando de editar el tensor directamente, y no desea cambiar el orden del tensor mismo.

grad[x<-3]=0.1
grad[x>2]=1
grad[(x>=-3 and x<=2)]=siglrelu(grad[(x>=-3 and x<=2)])*(1.0-siglrelu(grad[(x>=-3 and x<=2)]))

Esto es lo que realmente voy a hacer, y no estoy exactamente seguro de cómo hacer esto. Cualquier ayuda es apreciada, gracias!

Pregunta hecha hace 3 años, 5 meses, 0 días - Por logicluminary3c42


3 Respuestas:

  • Puedes usar & Operaciones,

    t = torch.arange(0., 10)
    print(t)
    print(t[(t > 2) & (t < 8)])
    

    La salida es,

    tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
    tensor([3., 4., 5., 6., 7.])
    

    Respondida el Dec 17, 2020 a las 23:02 - por debugdragon

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando en el código es debido a la forma en que estás intentando filtrar el tensor para obtener valores específicos. Cuando intentas utilizar tensor>2 and tensor<8, PyTorch no puede manejar las comparaciones directamente de esta forma.

    Para lograr obtener un tensor con los valores de 3-7, puedes utilizar la siguiente metodología:

    python
    import torch
    
    tensor = torch.tensor([0,1,2,3,4,5,6,7,8,9])
    new_tensor3 = tensor[(tensor > 2) & (tensor < 8)]
    print(new_tensor3)
    

    En este caso, estamos utilizando & en lugar de and para realizar la operación de comparación elemento por elemento en el tensor. Al hacerlo de esta manera, podrás obtener un tensor con los valores deseados de 3-7.

    En cuanto a tu scritp final, puedes adaptarlo de la siguiente manera:

    python
    import torch
    
    x = torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    grad = torch.zeros_like(x, dtype=torch.float)  

    Inicializamos un tensor de ceros de tipo float

    grad[x<-3] = 0.1 grad[x>2] = 1

    Para el rango (-3, 2)

    grad[(x>=-3) & (x<=2)] =

    Aplicar la función siglrelu y la siguiente operación

    print(grad)

    Espero que esto te ayude a resolver tus dudas y realizar las operaciones deseadas en tus tensores de PyTorch. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 18, 2020 a las 23:06 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener un tensor con los valores de 3 a 7 utilizando PyTorch, puedes utilizar la siguiente operación:

    python
    new_tensor3 = tensor[(tensor > 2) & (tensor < 8)]
    

    El operador & en PyTorch representa la operación lógica AND, que devolverá True solo si ambas condiciones son verdaderas.

    Ejemplo:

    python
    import torch
    
    tensor = torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    new_tensor3 = tensor[(tensor > 2) & (tensor < 8)]
    
    print(new_tensor3)
    

    Salida:

    
    tensor([3, 4, 5, 6, 7])
    

    Esto te dará un tensor con los valores de 3 a 7.

    También puedes usar la función torch.where() para lograr lo mismo:

    python
    new_tensor3 = torch.where((tensor > 2) & (tensor < 8), tensor, torch.zeros_like(tensor))
    

    Esto creará un nuevo tensor con los mismos valores que tensor donde se cumple la condición (tensor > 2) & (tensor < 8), y con ceros en las demás posiciones.

    Respondida el Dec 18, 2020 a las 23:08 - por Gemini

    Votos positivos: 0 | Votos negativos: 0