Keras, dados los datos de entrada, obtiene el gradiente de LOSS sobre la entrada

demanda

El artículo debe utilizar un entrenamiento contradictorio, que debe obtener la pérdida de la función objetivo con respecto al gradiente de la muestra de entrada.

Método: utilice la función function de Keras.backbend

Puntos clave:

  • Encuentre una manera de alimentar la entrada al modelo
  • Keras.backend.function es responsable de alimentar los datos reales al marcador de posición correspondiente y luego ejecutar el proceso de subgráfico de cálculo requerido.

Definición de prototipo de Keras.backend.function:

keras.backend.function(inputs, outputs, updates=None)
inputs: 占位符张量列表。
outputs: 输出张量列表。
updates: 更新操作列表。
**kwargs: 需要传递给 tf.Session.run 的参数。

Las entradas indican que para obtener los resultados de los gráficos de cálculo requeridos, deberá alimentar datos a esos marcadores de posición en el modelo.

El argumento de las entradas debe ser una lista o un objeto tupla. En términos generales, para obtener el gradiente del modelo de clasificación construido por el modelo secuencial de Keras (Sequential), al menos el siguiente marcador de posición debe ser alimentado con datos:

  1. Entrada de modelo: model.inputs
  2. Los pesos de las muestras del modelo: model.sample_weights
  3. La etiqueta correcta del modelo: model.targets
  4. Modo de trabajo de Keras: K.learning_phase ()

Por lo tanto, para el modelo, los parámetros reales de las entradas deben ser similares a:

input_tensors = [
                model.inputs[0],
                model.sample_weights[0],
                model.targets[0],
                K.learning_phase(),
            ]

El parámetro real de salidas es el gráfico de cálculo adicional que realmente queremos realizar. Al obtener el gradiente de pérdida con respecto a la entrada, debe ser:

grads = K.gradients(model.total_loss,model.inputs)

Combinando estas dos partes, puede saber cómo escribirlo: ¡
preste atención a la especificación de sesión y gráfico! De lo contrario, se informará de un error que indica que no se puede encontrar el gráfico de sesión o cálculo.
La definición de sesión y gráfico:

from tensorflow import Graph, Session
from keras import backend as K
        #1.创建空白的计算图和会话
        self.graph = Graph()
        self.session = Session(graph = self.graph)
        K.set_session(self.session)

Los ejemplos son los siguientes:

from keras import backbend as K
#model是编译好的模型,
with model.session.as_default():	#模型所在的session
     with model.graph.as_default(): #模型所在的graph 
            grads = K.gradients(model.total_loss,model.inputs)
            input_tensors = [
                model.inputs[0],
                model.sample_weights[0],
                model.targets[0],
                K.learning_phase(),
            ]
            get_gradients = K.function(inputs=input_tensors,
                                       outputs=grads)
            #最后,我们调用这个函数,然后往里面灌入数据。X_train和y_train就是我们准备好特征和标签数据。
            
            print(get_gradients([X_train,	#输入的numpy,里面是实际的数据
                                 np.ones(X_train.shape[0]),#各个样本的权值都是一样的
                                 y_train,	#输入的标签,它是个numpy,
                                 0			#默认为0,表示TEST
                                 ]))

Salida de muestra:

[array([[[ 3.37047881e-04],
        [ 1.35833543e-04],
        [ 5.89624338e-04],
        ...,
        [-5.74612432e-06],
        [-6.32335559e-06],
        [-5.20324556e-06]],

       [[ 6.09082752e-04],
        [ 3.00324697e-04],
        [ 9.02293774e-04],
        ...,
        [-4.81713050e-06],
        [-5.49305832e-06],
        [-4.50423022e-06]],

       [[-1.64922003e-05],
        [-2.31035738e-05],
        [ 3.09628103e-06],
        ...,
        [-4.12806503e-06],
        [-4.30005048e-06],
        [-3.67417783e-06]],

       ...,

       [[ 2.34020845e-04],
        [-7.04993727e-06],
        [ 7.22564815e-04],
        ...,
        [ 7.31242017e-06],
        [ 8.50264314e-06],
        。。。。

Por supuesto, este método también se puede utilizar para obtener el gradiente de algunas variables en la LOSS. En este momento, solo es necesario cambiar el segundo parámetro en K.gradients a la variable correspondiente.

Supongo que te gusta

Origin blog.csdn.net/jmh1996/article/details/109549684
Recomendado
Clasificación