Acceso a los valores de gradiente de las salidas del modelo keras con respecto a las entradas

Hice un modelo NN bastante simple para hacer algunas regresiones no lineales para mí en Keras, como un ejercicio de introducción. Subí mi cuaderno jupyter como una esencia aquí (se procesa correctamente en github), que es bastante breve y al punto.

Simplemente se ajusta a la función 1D y = (x – 5) ^ 2/25.

Sé que Theano y Tensorflow son, en su núcleo, marcos de aprobación derivados (gradiente) basados ​​en gráficos. Y el propósito principal es utilizar los gradientes de las funciones de pérdida con respecto a los pesos para la optimización basada en pasos de gradiente.

Pero lo que estoy tratando de entender es si tengo acceso a algo que, dado un modelo entrenado, puede aproximar las derivadas de las entradas con respecto a la capa de salida para mí (no la función de peso o pérdida). Entonces, para este caso, me gustaría que y ‘= 2 (x-5) /25.0 se estimara a través del gráfico derivado de la red para mí para un valor indicado de la entrada x, en el estado actual de la red.

¿Tengo alguna opción en las API de Keras o Theano / TF backend para hacer esto, o necesito hacer mi propia cadena de forma que las ponderaciones (o tal vez agregar mis propias capas de “identidad” no entrenables o algo así)? En mi cuaderno, puedes verme probar algunos enfoques basados ​​en lo que pude encontrar hasta ahora, pero sin un montón de éxito.

Para hacerlo concreto, tengo un modelo de keras en funcionamiento 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 en, digamos, x = 0.5.

Todos mis bashs de extraer valores de gradiente basados ​​en la búsqueda de respuestas pasadas han dado lugar a errores de syntax. Desde un punto de vista de alto nivel, ¿es esta una característica compatible de Keras o alguna solución va a ser específica para el backend?

Como mencionas, Theano y TF son simbólicos, por lo que hacer un derivado 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) de la salida dada la entrada, luego crea 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.