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.

1. Pérdida ponderada en CrossEntropyLoss() 2. Combinación de WeightedRandomSampler y subsampler

Quería implementar pesos de clase en mi problema de clasificación de 3 clases.

Intenté agregar directamente los pesos, lo cual me da un error al pasar la salida y las etiquetas de mi modelo a mi función de pérdida.

criterion = nn.CrossEntropyLoss(weight=torch.tensor([1,2,2]))

El error:

loss = criterion(out, labels)
expected scalar type Float but found Long

Entonces, imprimí los tipos de datos y los cambié a float, pero aún me da el mismo error.

labels = labels.float()
print("Etiquetas de entrenamiento:", labels, labels.dtype)
print("Salida de entrenamiento:", out, out.dtype)
loss = criterion(out, labels)

Salida:

Etiquetas de entrenamiento tensor([2.]) torch.float32
Salida de entrenamiento tensor([[ 0.0540, -0.1439, -0.0070]], grad_fn=<addmmbackward0>) torch.float32
expected scalar type Float but found Long

También intenté cambiarlo a float64(), pero me indica que el objeto tensor no tiene el atributo float64.

Problema 2: No lo he probado, pero he visto que el enfoque más utilizado sería el RandomWeightedSampler. Mi problema es que uso CV con K-Fold y uso un SubSampler para eso. ¿Es posible usar ambos? No he encontrado nada relacionado con eso.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Según mi comprensión, podemos usar tanto RandomWeightedSampler como SubSampler juntos. Podemos primero usar un SubSampler para crear un subconjunto de datos para la validación cruzada de k-fold y luego usar RandomWeightedSampler dentro de cada pliegue para manejar problemas de desequilibrio de clases.

    Para lograr esto, podemos crear una clase de muestreador personalizada que combine tanto SubSampler como RandomWeightedSampler. Esta clase de muestreador puede tomar argumentos para los pesos de las clases y los índices para SubSampler, que se pueden usar para crear un subconjunto de datos durante la validación cruzada de k-fold.

    Aquí hay un ejemplo de cómo podemos crear una clase de muestreador personalizada:

    import torch
    from torch.utils.data import SubsetRandomSampler, Sampler
    
    class CustomSampler(Sampler):
        def __init__(self, indices, class_weights):
            self.weights = torch.DoubleTensor(class_weights)
            self.indices = indices
            self.num_samples = len(self.indices)
    
        def __iter__(self):
            return iter(torch.multinomial(self.weights, self.num_samples, replacement=True))
    
        def __len__(self):
            return self.num_samples
    

    En esta clase, estamos heredando de la clase base ‘Sampler’ y sobrescribiendo sus métodos ‘iter‘ y ‘len‘. ‘indices’ es la lista de índices para el subconjunto de datos, y ‘class_weights’ es la lista de pesos para cada clase.

    Convertimos los ‘class_weights’ en un tensor de tipo DoubleTensor y lo usamos en el método ‘iter‘ para dar más peso a las clases con menos muestras. Finalmente, usamos ‘torch.multinomial’ para generar índices de muestras en cada lote.

    Ahora, podemos usar esta clase de muestreador personalizada de la siguiente manera:

    train_indices = # lista de índices para el subconjunto de datos de entrenamiento
    val_indices = # lista de índices para el subconjunto de datos de validación
    train_weights = [1, 2, 2] # pesos para cada clase en los datos de entrenamiento
    val_weights = [1, 1, 1] # pesos para cada clase en los datos de validación
    
    train_sampler = CustomSampler(train_indices, train_weights)
    val_sampler = CustomSampler(val_indices, val_weights)
    
    train_loader = torch.utils.data.DataLoader(dataset, batch_size=tamaño_lote, sampler=train_sampler)
    val_loader = torch.utils.data.DataLoader(dataset, batch_size=tamaño_lote, sampler=val_sampler)
    

    Aquí, ‘train_indices’ y ‘val_indices’ son listas de índices para los subconjuntos de datos de entrenamiento y validación, respectivamente. Pasamos estas listas junto con los pesos de las clases a la clase ‘CustomSampler’ para crear objetos ‘train_sampler’ y ‘val_sampler’. Luego podemos usar estos objetos como muestreadores en objetos ‘DataLoader’ para crear cargadores de datos para entrenamiento y validación.

    Este enfoque nos permite combinar SubSampler y RandomWeightedSampler para manejar problemas de desequilibrio de clases en la validación cruzada de k-fold.

Comments are closed.