python - tutorial - Accediendo a los valores de gradiente de los resultados del modelo de keras con respecto a las entradas
tutorial keras español (1)
Hice un modelo de NN bastante simple para hacer algunas regresiones no lineales en Keras, como ejercicio de introducción. Cargué mi cuaderno jupyter como una idea general aquí (se reproduce correctamente en github), que es bastante corto y al grano.
Simplemente ajusta la función 1D y = (x - 5) ^ 2/25.
Sé que Theano y Tensorflow son, en su núcleo, estructuras derivadas derivadas (gradientes) basadas en gráficos. Y la utilización de los gradientes de las funciones de pérdida con respecto a los pesos para la gradiente de gradiente basada en la optimización son el objetivo principal de eso.
Pero lo que intento entender es si tengo acceso a algo que, dado un modelo entrenado, pueda aproximar las derivadas de las entradas con respecto a la capa de salida para mí (no las ponderaciones o la función de pérdida). Por lo tanto, para este caso, me gustaría que y ''= 2 (x-5) /25.0 se estimase a través del gráfico derivado de la red para un valor indicado de la entrada x, en el estado actualmente entrenado de la red.
¿Tengo alguna opción en las API de back-end Keras o Theano / TF para hacer esto, o tengo que hacer mi propia cadena de alguna manera con los pesos (o tal vez agregar mis propias capas de "identidad" no entrenables o algo así)? En mi cuaderno, puede ver que intento algunos enfoques basados en lo que pude encontrar hasta ahora, pero sin mucho éxito.
Para hacerlo más concreto, tengo un modelo keras que funciona con la estructura:
model = Sequential()
# 1d input
model.add(Dense(64, input_dim=1, activation=''relu''))
model.add(Activation("linear"))
model.add(Dense(32, activation=''relu''))
model.add(Activation("linear"))
model.add(Dense(32, activation=''relu''))
# 1d output
model.add(Dense(1))
model.compile(loss=''mse'', optimizer=''adam'', metrics=["accuracy"])
model.fit(x, y,
batch_size=10,
epochs=25,
verbose=0,
validation_data=(x_test, y_test))
Me gustaría estimar la derivada de la salida y con respecto a la entrada x a, por ejemplo, x = 0.5.
Todos mis intentos de extraer valores de gradiente basados en la búsqueda de respuestas anteriores han llevado a errores de sintaxis. Desde un punto de vista de alto nivel, ¿es esta una característica admitida de Keras, o alguna solución va a ser específica de back-end?
Como mencionas, Theano y TF son simbólicos, por lo que hacer una derivada debería ser bastante fácil:
import theano
import theano.tensor as T
import keras.backend as K
J = T.grad(model.output[0, 0], model.input)
jacobian = K.function([model.input, K.learning_phase()], [J])
Primero calcula el gradiente simbólico (T.grad) del resultado dado a la entrada, luego construye una función a la que puede llamar y realiza el cálculo. Tenga en cuenta que a veces esto no es tan trivial debido a problemas de forma, ya que obtiene una derivada para cada elemento en la entrada.