Kerasは、入力データが与えられると、入力に関するLOSSの勾配を取得します

要求する

この論文では、入力サンプルの勾配に関して目的関数の損失を取得する必要がある敵対的トレーニングを使用する必要があります。

方法:Keras.backbendの関数関数を使用します

キーポイント:

  • モデルに入力を供給する方法を見つける
  • Keras.backend.functionは、実際のデータを対応するプレースホルダーにフィードし、必要な計算サブグラフプロセスを実行する役割を果たします。

Keras.backend.functionのプロトタイプ定義:

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

入力は、必要な計算グラフの結果を取得するために、モデル内のそれらのプレースホルダーにデータをフィードする必要があることを示しています。

入力の引数は、リストまたはタプルオブジェクトである必要があります。一般的に、Kerasシーケンシャルモデル(シーケンシャル)によって構築された分類モデルモデルの勾配を取得するには、少なくとも次のプレースホルダーにデータを入力する必要があります。

  1. モデル入力:model.inputs
  2. モデルのサンプルの重み:model.sample_weights
  3. モデルの正しいラベル:model.targets
  4. Kerasの動作モード:K.learning_phase()

したがって、モデルの場合、入力の実際のパラメーターは次のようになります。

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

出力の実際のパラメーターは、実際に実行したい追加の計算グラフです。入力に対する損失の勾配を取得する場合は、次のようにする必要があります。

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

これらの2つの部分を組み合わせると、その書き方を知ることができ
ます。セッションとグラフの仕様に注意してください。そうしないと、セッションまたは計算グラフが見つからないというエラーが報告されます。
セッションとグラフの定義:

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)

例は次のとおりです。

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
                                 ]))

サンプル出力:

[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],
        。。。。

もちろん、この方法を使用して、LOSSの一部の変数の勾配を取得することもできます。現時点では、K.gradientsの2番目のパラメーターを対応する変数に変更するだけで済みます。

おすすめ

転載: blog.csdn.net/jmh1996/article/details/109549684