Notas de estudio de conducción autónoma para título de imagen

1. Introducción

Mapeo de secuencia Actualmente estamos planeando utilizar la estructura Transformer;

2 Agradecimientos

Gracias por la información proporcionada por la cuenta pública "Productos secos de tecnología de inteligencia artificial", "Cómo usar la antorcha incorporada de pytorch.nn.CTCLoss elegantemente"

¡Déjame adquirir un gran conocimiento!

3 reglas para construir el vocabulario

Usamos "," como separador unificado;

3.1 Clase de diccionario-Vocab

Usamos set como la estructura de datos del diccionario;

4 diseño de modelo

3.1 red troncal —— rec_r34_vd

El diseño de la red troncal se basa en el modelo de reconocimiento de PaddleOCR,

El enlace al código es el siguiente:

https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/modeling/backbones/rec_resnet_vd.py

3.2 función de pérdida-pérdida de CTC

La derivación matemática de la función de pérdida de CTC:

https://zhuanlan.zhihu.com/p/43534801

Para el proceso de cálculo de la programación dinámica de CTC en CTC Loss, puede consultar el documento PPT de Deep Systems:

https://docs.google.com/presentation/d/12gYcPft9_4cxk2AD6Z6ZlJNa3wvZCW1ms31nhq51vMk/pub?start=false&loop=false&delayms=3000#slide=id.g24e9f0de4f_0_332

3.2.1 Escritura de código——torch.nn.CTCLoss

我们使用PyTorch自带的CTCLoss;

CTCLoss的输入有两种方式:acolchado 和 sin acolchado;

Aquí recomendamos sin relleno方式,因为不用预先做padding的操作,会方便一些,也更好理解;


Descripción del parámetro nn.CTCLoss ():

en blanco - ID en blanco:

Similar a un marcador de posición, usado para separar dos rangos de caracteres en CTC-Loss, como "ap-ple", puede usar un espacio en blanco para separar los mismos elementos en una cadena;

También agregaremos <blanco> caracteres al diccionario y dividiremos el ID en el diccionario en el parámetro en blanco aquí ;

Descripción del parámetro ctc_loss ():

El código de referencia es

loss = ctc_loss(output.log_softmax(2), target, input_lengths, target_lengths)

input- array predicción:

El valor predicho del modelo de entrada requiere log_softmax (2) antes de ingresar a la pérdida;

objetivos -una larga matriz de matrices de destino:

Se denomina matriz larga porque se empalma con el valor objetivo. El método de empalme es utilizar "matriz_larga + = matriz";

Para obtener una explicación visual, consulte la publicación del blog que publiqué, péguela aquí,

 

 

 

 

5 depuración de modelos

5.1 La pérdida aparece "nan": el modelo tiene un desbordamiento numérico durante el cálculo

5.1.1 El fenómeno "nan" causado por la explosión del gradiente, no causado por una tasa de aprendizaje excesiva lr

La explosión del gradiente hará que la pérdida aparezca como fenómeno "nan", esto se debe a que el gradiente tiene un problema de "desbordamiento de valor" en el proceso de retropropagación (estos problemas no son necesariamente causados ​​por problemas de código)

Punto de observación 1: Después de reducir la tasa de aprendizaje, no hay explosión de gradiente, lo que indica que no es un problema de cálculo de pérdidas, sino un problema de retropropagación de gradiente;

Punto de observación 2: Cuando se usa la tasa de aprendizaje grande inicial, la situación de " pérdida es nan " aparecerá ocasionalmente , en lugar de cada entrenamiento, significa que no hay problema con el cálculo de la pérdida hacia adelante;

Punto de observación 3: cuando se utiliza la tasa de aprendizaje grande inicial, el modelo tiene una cierta probabilidad (por ejemplo, 50%) de converger muy bien, lo que indica que no hay ningún problema con la configuración de la tasa de aprendizaje;

En resumen, esto puede deberse a la gran cantidad de estructuras "completamente conectadas" en el modelo . Cuando el gradiente se pasa en la dirección inversa, hay múltiples operaciones de "multiplicación" y se produce la explosión del gradiente;

Conjetura: puede intentar utilizar el recorte de degradado para evitar el desbordamiento numérico causado por el retorno del degradado;

Resultados experimentales: es factible utilizar el recorte de gradiente;

6 Preguntas y notas

4.1 ¿Por qué Transformer no puede especificar el tamaño de la codificación de salida?

Cuando estaba escribiendo hoy, pensé en esta pregunta: ¿Por qué Transformer no puede especificar el tamaño de la codificación de salida?

Eché un vistazo a la descripción de la interfaz de PyTorch, de hecho no está allí.

Luego le pregunté al Sr. Liangliang, el maestro dijo que era porque la versión de implementación de PyTorch no proporcionaba esta función.

Me sugirió que echara un vistazo a OpenNMT-py , ¡gracias maestro Liangliang!

Supongo que te gusta

Origin blog.csdn.net/songyuc/article/details/107460069
Recomendado
Clasificación