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.
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:
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:
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.