pregunta
Al ejecutar el laboratorio, el valor de pérdida fue nan (como se muestra en la siguiente figura)
solución de problemas
Debido a que hay algunos juicios, la declaración se usa bd_index = torch.where(s_label != o_label)[0]
para seleccionar los subíndices que cumplen las condiciones, lo que puede devolver una lista vacía (cuando no se cumplen las condiciones), porque la torch.log()
función se usa para cálculos posteriores, por lo que si es una lista vacía , aparecerá loss = nan
. Sin embargo, se deben analizar diferentes situaciones en detalle. La mejor manera de solucionar el problema es usar declaraciones with torch.autograd.detect_anomaly():
para envolver el código de entrenamiento (como se muestra en la figura siguiente), de modo que el punto donde aparece el valor nulo se pueda identificar rápidamente. Ubicado (debe retirarse durante el entrenamiento normal, lo que arrastrará a baja velocidad)
Finalmente colocado torch.log()
en todas partes , la solución final es agregar constantes log_prob = torch.log(prob + 1e-7)
para que no haya valores nulos.
Ejecutar con éxito: