[Teoría de redes neuronales de Pytorch] 34 Balance de muestra + funciones de pérdida comunes de modelos de clasificación

1 muestra de ecualización

Cuando las muestras de entrenamiento no están equilibradas, se puede utilizar el sobremuestreo, el submuestreo, la mejora de datos y otros medios para evitar el sobreajuste.

1.1 Uso de clases de muestreo ponderado

Hay una clase de muestreo ponderado derivada WeightedRandomSampler en la clase Sampler, que puede muestrear en orden aleatorio de acuerdo con la probabilidad especificada al cargar datos.

Muestreador aleatorio ponderado (muestras_peso, muestras_num)

1. Pesos: corresponde al peso de la "muestra" y no al "peso de la categoría".  Es decir: hay mil muestras, y el valor del peso es mil, entonces len(peso) = número de muestras.
2. num_sampes: El número de muestras a extraer. El número de muestras a seleccionar es generalmente menor que el número total de muestras.
3. reemplazo: Se utiliza para especificar si una determinada muestra se puede seleccionar repetidamente. . Si se establece en False, cuando se seleccionan todas las muestras de una determinada clase, pero el número de muestras aún no ha llegado a num_samples, el muestreador ya no seleccionará esta clase, lo que puede provocar que el parámetro de pesos deje de ser válido.

1.2 Explicación gráfica de WeightedRandomSampler

Como se muestra en la siguiente figura, peso es un tensor, que representa el peso correspondiente a la muestra en cada posición, WeightedRandomSampler(weights, 6, True), lo que significa que de acuerdo al peso dado por peso, se generan seis índices, y es un muestreo repetido.

 Se puede ver en la salida que la posición [1] = 10 se muestrea más veces debido a su mayor peso, la posición [0] no se muestrea porque su peso es 0, y el resto de las posiciones tienen pesos bajos y solo se muestrean una vez.

1.2.1 Obtener el método de cálculo manual del peso de un conjunto de datos

Cada ítem en peso = [ ] representa el recíproco del tipo de muestra en la muestra total.

Por ejemplo: conjunto de datos animal = [ gato, gato, perro, perro, perro], el gato tiene dos, el perro tiene tres.

Solución:
        Paso 1: Calcular la proporción de cada animal,
                cat_count = 2/5 = 0,4
                dog_count = 3/5 = 0,6

        Paso 2: Calcular el recíproco de conteo, que es el recíproco de la proporción.Este valor es peso
                gato_peso = 1/conteo = 1/0.4 = 2.5
                perro_peso = 1/conteo = 1/0.6 = 1.67

        Paso 3: generar una
                lista de pesos los pesos se pueden escribir como: peso = [2.5, 2.5, 1.67, 1.67, 1.67]

1.3 Código de combate de WeightedRandomSampler

1.3.1 Muestrear 1000 piezas de datos con igual probabilidad y tomar 200 piezas de datos:

from torch.utils.data import WeightedRandomSampler
 
weights=[1]*1000
 
bbb=list(WeightedRandomSampler(weights, 200, replacement=True))
 
print(bbb)

1.3.2 Implementación en clase de conjunto de datos

weights =aaa=[1]*20000
sampler=WeightedRandomSampler(weights,num_samples=200,replacement=True)
 
_image_size = 32
_mean = [0.485, 0.456, 0.406]
_std = [0.229, 0.224, 0.225]
trans = transforms.Compose([
    transforms.RandomCrop(_image_size),
    # transforms.RandomHorizontalFlip(),
    # transforms.ColorJitter(.3, .3, .3),
    transforms.ToTensor(),
    # transforms.Normalize(_mean, _std),
])

if __name__ == '__main__':
 
    train_ds = DogsCatsDataset(r"D:\data\ocr\wanqu\archive", "train", transform=trans)
    train_dl = DataLoader(train_ds, batch_size=2,num_workers=1,sampler=sampler)
    # train_dl = DataLoader(train_ds, batch_size=20,num_workers=1,shuffle=True)
 
    for i, (data, target) in enumerate(train_dl):
        # print(i,target)
        if len(np.where(target.numpy() == 1)[0])>0:
            print('find 1')

1.3.3 Sugerencia

En la clase Dataloader, el parámetro Shume no se puede usar cuando se usa la clase Sampler.

1.4 Impacto del muestreo ponderado

La ecualización de muestras por muestreo es solo un método auxiliar, y también introducirá algunos problemas nuevos. Cuando las condiciones lo permitan, se recomienda que las muestras recogidas sean lo más equilibradas posible.

1.4.1 Sobremuestreo

La repetición de datos proporcionales en realidad no introduce más datos en el modelo, y enfatizar demasiado los datos proporcionales amplificará el impacto del ruido proporcional en el modelo.

1.4.2 Submuestreo

Descartar una gran cantidad de datos tendrá el mismo problema de sobreajuste que el sobremuestreo.

1.5 Control del equilibrio de la muestra a través de la pérdida de peso

En tareas de clasificación no exclusivas de etiquetas múltiples (un objeto se puede predecir con clasificaciones múltiples), la función BCEWithLogitsLoss también se puede usar para asignar diferentes pesos a cada clase al calcular la pérdida.

De esta forma, se puede equilibrar la capacidad predictiva del modelo para cada categoría. Por ejemplo, si el número de multiclases es 6, puede usar un código similar para especificar el peso de cada clase:

pos_weight = torch.ones( [6] )#为每个分类指定权重为1
criterion = torch.nn.BCEwithLogitsioss( posweight = pos_weight)

2 Funciones de pérdida comúnmente utilizadas en modelos de clasificación

2.1 Pérdida de BCEL

Se utiliza para la clasificación binaria de una sola etiqueta o la clasificación binaria de múltiples etiquetas, es decir, una muestra puede tener múltiples clasificaciones, que no son mutuamente excluyentes. Las dimensiones de la salida y el objetivo son (lote, C), donde lote es el número de muestras y C es el número de clases. Cada valor de C representa la probabilidad de pertenecer a una clase de etiquetas.

2.2 BCEWthLogtsLoss

Se utiliza para clasificación binaria de una sola etiqueta o clasificación binaria de múltiples etiquetas.Es equivalente a Sigmoid+BCELoss, es decir, haga Sigmoid una vez al resultado de la salida de la red para cambiar su rango de valores a [0, 1], y luego haz BCELoss entre él y la etiqueta.

BCELoss se usa cuando nn.Sigmoid se usa en la última capa de la red.

Cuando la última capa de la red no usa nn.Sigmoid, use BCEWithLogitsLoss.

2.3 Pérdida de entropía cruzada

Para la clasificación multiclase, las dimensiones de la salida y el objetivo son (lote, C), el lote es el número de muestras y C es el número de clases. Cada C es mutuamente excluyente e interrelacionado.

Para los valores de C de cada lote, el softmax de cada C se calcula en conjunto, por lo que la suma de todos los valores de C de cada lote es 1, el valor que sea mayor representa a qué categoría pertenece.

Para la clasificación binaria, las dimensiones de salida y de destino son (lote, 2).

Supongo que te gusta

Origin blog.csdn.net/qq_39237205/article/details/124097667
Recomendado
Clasificación