Datawhale Zero Foundation Entry CV Competition-Task04 Model Training and Verification

En el capítulo anterior, creamos una CNN simple para el entrenamiento y visualizamos la pérdida de errores durante el entrenamiento y la precisión de la predicción del primer carácter, pero estos están lejos de ser suficientes. Un proceso de formación de aprendizaje profundo maduro y calificado tiene al menos las siguientes funciones:

  • Entrene en el conjunto de entrenamiento y verifique en el conjunto de validación;
  • El modelo puede guardar el peso óptimo y leer el peso;
  • Registre la precisión del conjunto de entrenamiento y el conjunto de validación para facilitar el ajuste de parámetros.

4 Formación y verificación de modelos

Con este fin, este capítulo explicará la construcción del conjunto de verificación, entrenamiento y verificación del modelo, guardado y carga del modelo, y ajuste del modelo En algunas secciones, el código Pytorch será combinado.

4.1 Métodos para evitar el sobreajuste

En el proceso de entrenamiento de los modelos de aprendizaje automático (especialmente los modelos de aprendizaje profundo), el modelo es muy fácil de sobreajustar. El error de entrenamiento del modelo de aprendizaje profundo disminuirá gradualmente en el proceso de entrenamiento continuo, pero la tendencia del error de prueba no es necesariamente.
En el proceso de entrenamiento del modelo, el modelo solo puede usar datos de entrenamiento para el entrenamiento y el modelo no puede tocar las muestras en el conjunto de prueba. Por lo tanto, si el modelo aprende el conjunto de entrenamiento demasiado bien, el modelo recordará los detalles de la muestra de entrenamiento, lo que dará como resultado una generalización deficiente del modelo en el conjunto de prueba. Este fenómeno se denomina sobreajuste. El sobreajuste corresponde al desajuste, es decir, el modelo no encaja bien en el conjunto de entrenamiento.
Inserte la descripción de la imagen aquí
Como se muestra en la figura: a medida que aumenta la complejidad del modelo y el número de rondas de entrenamiento del modelo, el error del modelo CNN en el conjunto de entrenamiento disminuirá, pero el error en el conjunto de prueba disminuirá gradualmente y luego aumentará gradualmente, y estamos persiguiendo Cuanto mayor sea la precisión del modelo en el equipo de prueba, mejor.
Hay muchas razones para el ajuste excesivo del modelo. La más común es que la complejidad del modelo es demasiado alta, lo que hace que el modelo aprenda todos los aspectos de los datos de entrenamiento y aprenda algunas reglas sutiles. Los métodos para resolver el sobreajuste incluyen principalmente mejora de datos, atenuación de peso, método de parada temprana y abandono.

  • Aumento de datos

Generalmente, para obtener un mejor modelo, se necesita una gran cantidad de parámetros de entrenamiento. Esta es una de las razones por las que la red de CNN se está volviendo cada vez más profunda. Si las muestras de entrenamiento carecen de diversidad, entonces ninguna cantidad de parámetros de entrenamiento carece de sentido, porque Con el sobreajuste, la capacidad de generalización del modelo entrenado será correspondientemente pobre. La diversidad de funciones que aporta una gran cantidad de datos ayuda a aprovechar al máximo todos los parámetros de entrenamiento. Los métodos de mejora de datos generalmente incluyen: 1) Recopilar más datos; 2) Girar, voltear, recortar, establecer el brillo y el contraste de la imagen y estandarizar los datos en los datos existentes; 3) Usar modelos generativos (como GAN ) Genere algunos datos.
En los métodos comunes de amplificación de datos, el color, el tamaño, la forma, el espacio y los píxeles de la imagen generalmente se transforman. Por supuesto, se pueden combinar libremente diferentes métodos de amplificación de datos para obtener métodos de amplificación de datos más abundantes.
Tomemos torchvision.transforms como ejemplo. Primero, comprenda los métodos de amplificación de datos en su conjunto, incluidos:

中心裁剪:transforms.CenterCrop
随机裁剪:transforms.RandomCrop
随机长宽比裁剪:transforms.RandomResizedCrop
上下左右中心裁剪:transforms.FiveCrop
上下左右中心裁剪后翻转: transforms.TenCrop
依概率p水平翻转:transforms.RandomHorizontalFlip(p=0.5)
依概率p垂直翻转:transforms.RandomVerticalFlip(p=0.5)
随机旋转:transforms.RandomRotation
对图像进行随机遮挡: transforms.RandomErasing 
尺寸变换:transforms.Resize
标准化:transforms.Normalize
填充:transforms.Pad
修改亮度、对比度和饱和度:transforms.ColorJitter
转灰度图:transforms.Grayscale
依概率p转为灰度图:transforms.RandomGrayscale
线性变换:transforms.LinearTransformation()
仿射变换:transforms.RandomAffine
将数据转换为PILImage:transforms.ToPILImage
转为tensor,并归一化至[0-1]:transforms.ToTensor
用户自定义方法:transforms.Lambda
transforms.RandomChoice(transforms): 从给定的一系列transforms中选一个进行操作
transforms.RandomApply(transforms, p=0.5): 给一个transform加上概率,依概率进行操作
transforms.RandomOrder: 将transforms中的操作随机打乱
  • Decaimiento de peso

La atenuación de peso comúnmente utilizada tiene regularización L1 y L2, L1 puede obtener parámetros más dispersos que L2, pero el punto cero de L1 no es divergente. En la función de pérdida, la atenuación de peso es un coeficiente que se coloca antes del término de regularización. El término de regularización generalmente indica la complejidad del modelo, por lo que la función de atenuación de peso es ajustar la influencia de la complejidad del modelo en la función de pérdida. Si la atenuación de peso es grande Entonces, el valor de la función de pérdida del modelo complejo también es grande.

  • Parada anticipada (parada temprana)

El método de detención anticipada es en realidad otro método de regularización, que consiste en calcular la tasa de error respectiva después de una iteración en el conjunto de entrenamiento y el conjunto de validación. Cuando la tasa de error en el conjunto de validación es la más pequeña, detenga el entrenamiento antes de comenzar a aumentar. Porque si continúa entrenando, la tasa de error en el conjunto de entrenamiento generalmente continuará disminuyendo, pero la tasa de error en el conjunto de validación aumentará, lo que significa que la capacidad de generalización del modelo ha comenzado a deteriorarse y se producen problemas de sobreajuste, así que deténgase a tiempo. Puede obtenerse un modelo mejor generalizado. Como se muestra en la siguiente figura (la izquierda es la tasa de error del conjunto de entrenamiento y la figura de la derecha es la tasa de error del conjunto de validación. El entrenamiento termina antes en la línea de puntos):
Inserte la descripción de la imagen aquí

  • Abandonar

El uso de la deserción durante el entrenamiento de CNN es restablecer aleatoriamente el peso de algunas neuronas a 0 durante cada proceso de entrenamiento, es decir, hacer que algunas neuronas fallen, lo que puede reducir la cantidad de parámetros y evitar el sobreajuste. Hay dos puntos de vista sobre por qué la deserción es efectiva: 1. Cada iteración desactiva aleatoriamente algunas neuronas, lo que aumenta la diversidad del modelo y logra un efecto similar a la integración de múltiples modelos, evitando el sobreajuste. 2. La deserción es en realidad un proceso de mejora de datos, que conduce a la escasez y hace que las diferencias de los grupos de datos locales sean más obvias, por lo que puede evitar el sobreajuste.
Inserte la descripción de la imagen aquí

  • Construya un conjunto de validación distribuido uniformemente

La mejor solución al problema de sobreajuste: construya un conjunto de muestra que sea lo más consistente posible con el conjunto de prueba (se puede llamar conjunto de validación) y verifique continuamente la precisión del modelo en el conjunto de validación durante el proceso de entrenamiento, y utilícelo para controlar el modelo. Formación.

4.2 Construcción de un conjunto de validación

En general, los concursantes pueden dividir un conjunto de verificación localmente para la verificación local. El conjunto de entrenamiento, el conjunto de validación y el conjunto de prueba tienen diferentes funciones:

  • Conjunto de trenes: el modelo se utiliza para entrenar y ajustar los parámetros del modelo;
  • Conjunto de validación: se utiliza para verificar la precisión del modelo y ajustar los hiperparámetros del modelo;
  • Conjunto de prueba: verifique la capacidad de generalización del modelo.

Dado que el conjunto de entrenamiento y el conjunto de validación están separados, la precisión del modelo en el conjunto de validación puede reflejar la capacidad de generalización del modelo hasta cierto punto. Al dividir el conjunto de verificación, es necesario prestar atención a la distribución del conjunto de verificación y el conjunto de prueba para que sea lo más consistente posible; de ​​lo contrario, la precisión del modelo en el conjunto de verificación perderá su importancia orientativa.
Dado que el conjunto de verificación es tan importante, cómo dividir el conjunto de verificación local. En algunas competiciones, el concursante dará un conjunto de verificación; si el concursante no da un conjunto de verificación, entonces el concursante debe dividir una parte del conjunto de entrenamiento para obtener el conjunto de verificación. Hay varias formas de dividir el conjunto de verificación:
Inserte la descripción de la imagen aquí

  • Hold-Out

Divida directamente el conjunto de formación en dos partes, un nuevo conjunto de formación y un conjunto de validación. La ventaja de este método de división es el más directo y simple; la desventaja es que solo se obtiene un conjunto de validación, lo que puede hacer que el modelo se sobreajuste en el conjunto de validación. El escenario de aplicación del método de reserva es una situación en la que la cantidad de datos es relativamente grande.

  • Validación cruzada (CV)

Divida el conjunto de entrenamiento en K partes, tome la parte K-1 como el conjunto de entrenamiento y use la 1 parte restante como el conjunto de validación y el entrenamiento del bucle K. Este método de división consiste en que todos los conjuntos de entrenamiento son conjuntos de validación y la precisión de verificación del modelo final se obtiene mediante un promedio de K copias. La ventaja de este método es que la precisión del conjunto de verificación es relativamente confiable, y se pueden entrenar K tiempos para obtener K modelos con diversas diferencias; la desventaja de la verificación de CV es que necesita ser entrenado K veces, lo cual no es adecuado para situaciones con una gran cantidad de datos. La siguiente figura es un diagrama esquemático de validación cruzada de 10 veces:

Inserte la descripción de la imagen aquí

  • Método de auto muestreo (BootStrap)

El nuevo conjunto de entrenamiento y el conjunto de validación se obtienen mediante el método de muestreo con reemplazo.Cada conjunto de entrenamiento y conjunto de validación son diferentes. Este método de división es generalmente aplicable a situaciones en las que la cantidad de datos es pequeña. En el aprendizaje automático, el método Bootstrapping permite que un modelo o algoritmo comprenda mejor el sesgo, la varianza y las características que existen en él. Permita que el remuestreo incluya diferentes sesgos y luego inclúyalos como un todo. Como se muestra en la figura siguiente, cada grupo de muestra tiene partes diferentes y todas son diferentes. Esto afectará la media general, la desviación estándar y otros indicadores descriptivos del conjunto de datos. A su vez, puede desarrollar modelos más robustos.
Inserte la descripción de la imagen aquí
En esta competencia, se ha dividido en conjuntos de verificación, por lo que los jugadores pueden usar directamente el conjunto de entrenamiento para entrenar y usar el conjunto de verificación para verificar la precisión (por supuesto, también puede combinar el conjunto de entrenamiento y el conjunto de verificación para dividir el conjunto de verificación usted mismo).
Por supuesto, estos métodos de división son desde la perspectiva del método de división de datos. Los métodos de división generalmente utilizados en la competencia de datos existente son el método de exclusión y el método de validación cruzada. Si la cantidad de datos es relativamente grande, el método de retención es más apropiado. Por supuesto, el conjunto de verificación obtenido por la división de cualquier conjunto de verificación debe garantizar que la distribución del conjunto de entrenamiento -el conjunto de verificación- el conjunto de prueba sea consistente, por lo que es necesario prestar atención al método de división independientemente de la división.
La distribución aquí generalmente se refiere a la distribución estadística relacionada con la etiqueta. Por ejemplo, en la tarea de clasificación, "distribución" se refiere a la distribución de categoría de la etiqueta. La distribución de categoría del conjunto de entrenamiento-validación-conjunto-prueba debe ser aproximadamente la misma; si la etiqueta es con Con la información de tiempo, el intervalo de tiempo entre el conjunto de verificación y el conjunto de prueba debe ser consistente.

4.3 Formación y verificación de modelos

Aquí nuestro objetivo es utilizar Pytorch para completar el proceso de capacitación y verificación de CNN, y la estructura de la red de CNN es consistente con los capítulos anteriores. La estructura lógica que debemos completar es la siguiente:

  • Construir un conjunto de entrenamiento y un conjunto de validación;
  • Entrene y verifique cada ronda, y guarde el modelo de acuerdo con la mejor precisión del conjunto de verificación.
train_loader = torch.utils.data.DataLoader(
    train_dataset,
    batch_size=10, 
    shuffle=True, 
    num_workers=10, 
)   

val_loader = torch.utils.data.DataLoader(
    val_dataset,
    batch_size=10, 
    shuffle=False, 
    num_workers=10, 
)

model = SVHN_Model1()
criterion = nn.CrossEntropyLoss (size_average=False)
optimizer = torch.optim.Adam(model.parameters(), 0.001)
best_loss = 1000.0

for epoch in range(20):
    print('Epoch: ', epoch)
    train(train_loader, model, criterion, optimizer, epoch)
    val_loss = validate(val_loader, model, criterion)   
    # 记录下验证集精度
    if val_loss < best_loss:
        best_loss = val_loss
        torch.save(model.state_dict(), './model.pt')

El código de formación de cada Época es el siguiente:

def train(train_loader, model, criterion, optimizer, epoch):
    # 切换模型为训练模式
    model.train()
    
    for i, (input, target) in enumerate(train_loader):
        c0, c1, c2, c3, c4, c5 = model(data[0])
        loss = criterion(c0, data[1][:, 0]) + \
                criterion(c1, data[1][:, 1]) + \
                criterion(c2, data[1][:, 2]) + \
                criterion(c3, data[1][:, 3]) + \
                criterion(c4, data[1][:, 4]) + \
                criterion(c5, data[1][:, 5])
        loss /= 6
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

El código de verificación de cada Época es el siguiente:

def validate(val_loader, model, criterion):
    # 切换模型为预测模型
    model.eval()
    val_loss = []
    
    # 不记录模型梯度信息
    with torch.no_grad():
        for i, (input, target) in enumerate(val_loader):
            c0, c1, c2, c3, c4, c5 = model(data[0])
            loss = criterion(c0, data[1][:, 0]) + \
                    criterion(c1, data[1][:, 1]) + \
                    criterion(c2, data[1][:, 2]) + \
                    criterion(c3, data[1][:, 3]) + \
                    criterion(c4, data[1][:, 4]) + \
                    criterion(c5, data[1][:, 5])
            loss /= 6
            val_loss.append(loss.item())
    return np.mean(val_loss)

Guardar y cargar Modelo
El ahorro y la carga del modelo en Pytorch es muy simple La forma más común es la de guardar y cargar los parámetros del modelo.:
torch.save(model_object.state_dict(), 'model.pt')
model.load_state_dict(torch.load(' model.pt'))

4.4 Proceso de ajuste del modelo

El aprendizaje profundo tiene pocos principios, pero es muy práctico. Básicamente, muchos modelos solo se pueden verificar mediante capacitación. Al mismo tiempo, el aprendizaje profundo tiene muchas estructuras de red e hiperparámetros, por lo que debe probarse repetidamente. El entrenamiento de modelos de aprendizaje profundo requiere soporte de hardware de GPU y más tiempo de entrenamiento. Cómo entrenar modelos de aprendizaje profundo de manera efectiva se ha convertido gradualmente en un tema.
Existen muchas técnicas de formación para el aprendizaje profundo. Los enlaces de lectura recomendados son:

  • http://karpathy.github.io/2019/04/25/recipe/

Inserte la descripción de la imagen aquí

  • optimización del optimizador de pytorch

torch.optim es un paquete que implementa varios algoritmos de optimización. Los métodos más utilizados ya son compatibles y la interfaz es muy convencional, por lo que puede integrar fácilmente métodos más complejos en el futuro.

optim.SGD:随机梯度下降法
optim.Adagrad:自适应学习率梯度下降法
optim.RMSprop:Adagrad的改进
optim.Adadelta:Adagrad的改进
optim.Adam:RMSprop结合Momentum
optim.Adamax:Adam增加学习率上限
optim.SparseAdam:稀疏版Adam
optim.ASGD:随机平均梯度下降
optim.Rprop:弹性反向传播
optim.LBFGS:BFGS的改进
  • Seis estrategias de ajuste de la tasa de aprendizaje de pytorch

Ajuste ordenado: paso, multipaso, exponencial y recocido de coseno
Ajuste adaptable: ReduceLROnPleateau
Ajuste personalizado:
Inicialización de la tasa de aprendizaje de Lambda : Establezca el número más pequeño: 0.01 , 0.001, 0.0001

# 等间隔调整学习率
torch.optim.lr_scheduler.StepLR(optimizer,step_size,gamma=0.1)
# 按给定间隔调整学习率
optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1)
# 按指数衰减调整学习率
optim.lr_scheduler.ExponentialLR(optimizer, gamma=gamma)
# 余弦周期调整学习率
optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=t_max, eta_min=0.)
# 监控指标,当指标不再变化则调整
optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=factor, mode=mode, patience=patience, cooldown=cooldown, min_lr=min_lr, verbose=verbose)
# 自定义调整策略
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])

referencia

La práctica la visión por ordenador (Vista de la calle codificación de caracteres de reconocimiento)
datawhalechina
práctica en el aprendizaje profundo

Datawhale es una organización de código abierto que se centra en la ciencia de datos y la inteligencia artificial. Reúne a estudiantes excelentes de muchas universidades y empresas reconocidas en muchos campos, y reúne a un grupo de miembros del equipo con espíritu de código abierto y exploratorio. Con la visión de "para el alumno, crecer con los alumnos", Datawhale fomenta la verdadera autoexpresión, la apertura y la tolerancia, la confianza mutua y la asistencia mutua, el valor para intentar cometer errores y el valor para asumir la responsabilidad. Al mismo tiempo, Datawhale utiliza el concepto de código abierto para explorar contenido de código abierto, aprendizaje de código abierto y soluciones de código abierto, potenciar la formación del talento, ayudar al crecimiento del talento y establecer una conexión entre personas, personas y conocimiento, personas y empresas, y personas y el futuro.

Supongo que te gusta

Origin blog.csdn.net/OuDiShenmiss/article/details/106446702
Recomendado
Clasificación