Estoy tratando de volver a implementar redes neuronales en Python. Implementé la función de costo y el algoritmo de retropropagación correctamente. Los he comprobado ejecutando su código equivalente de octava.
Pero cuando intento usar la scipy.optimize.fmin_cg
función, las iteraciones tardan mucho tiempo en ejecutarse. Sale con una advertencia y me da un error que dice que "no se logró la tasa de error deseada".
El mismo programa en Octave se ejecuta bien. Sin embargo, tiene su propia fmincg
función definida.
¿Qué estoy haciendo mal?
Respuestas:
Como una pista futura, use el doble signo de interrogación. para extraer la fuente de la función:
Mirando las fuentes de scipy, este mensaje de error aparece si el parámetro interno alpha_k es cero o Ninguno.
Este valor a su vez está vinculado al algoritmo de búsqueda interno de Wolfe Line. En particular, se llama cuando la búsqueda no encuentra un mejor valor a lo largo de la trayectoria de búsqueda. Es probable que su función tenga un contorno lineal en algún lugar a lo largo del cual cae el optimizador y se confunde.
¿Quizás intente agregar una devolución de llamada y vea dónde se genera la búsqueda fallida?
fuente
Supongo que no especificó el
fprime
parámetro. Si no proporciona este parámetro,fmin_cg
tiene que encontrar su propia solución, lo que generalmente es mucho más lento que una solución óptima. Su código podría verse así:fuente
Sé que esta es una vieja pregunta, pero he estado luchando con un problema similar y pensé en publicar mi solución en caso de que alguien más se encuentre con esto.
Encontré que el problema era que no había inicializado correctamente el vector para romper la simetría.Θ
Después de hacer esto, corrí
fmin_cg
con f y fprime, y aunque todavía funcionó bastante lento, lo hizo sin ninguno de los errores o advertencias que había estado viendo hasta ese momento.De hecho, en realidad hizo un mejor trabajo al minimizar la función de costos que la implementación de matlab, a pesar de que ambos lo hicieron
max_iters = 100
.fuente