首页 文章

使用Keras获得模型输出的梯度w.r.t权重

提问于
浏览
21

我很有兴趣用Keras API的简单性构建强化学习模型 . 不幸的是,我无法根据权重提取输出的梯度(而不是误差) . 我发现以下代码执行类似的功能(Saliency maps of neural networks (using Keras)

get_output = theano.function([model.layers[0].input],model.layers[-1].output,allow_input_downcast=True)
fx = theano.function([model.layers[0].input] ,T.jacobian(model.layers[-1].output.flatten(),model.layers[0].input), allow_input_downcast=True)
grad = fx([trainingData])

关于如何计算关于每层的权重的模型输出的梯度的任何想法将是值得赞赏的 .

1 回答

  • 27

    要使用Keras获得关于权重的模型输出的梯度,您必须使用Keras后端模块 . 我创建了这个简单的例子来准确说明该做什么:

    from keras.models import Sequential
    from keras.layers import Dense, Activation
    from keras import backend as k
    
    
    model = Sequential()
    model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
    model.add(Dense(8, init='uniform', activation='relu'))
    model.add(Dense(1, init='uniform', activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    

    要计算梯度,我们首先需要找到输出张量 . 对于模型的输出(我最初提出的问题),我们只需调用model.output . 我们还可以通过调用model.layers [index] .output找到其他层的输出梯度

    outputTensor = model.output #Or model.layers[index].output
    

    然后我们需要选择与梯度相关的变量 .

    listOfVariableTensors = model.trainable_weights
      #or variableTensors = model.trainable_weights[0]
    

    我们现在可以计算梯度 . 它很简单如下:

    gradients = k.gradients(outputTensor, listOfVariableTensors)
    

    要实际运行给定输入的渐变,我们需要使用一点Tensorflow .

    trainingExample = np.random.random((1,8))
    sess = tf.InteractiveSession()
    sess.run(tf.initialize_all_variables())
    evaluated_gradients = sess.run(gradients,feed_dict={model.input:trainingExample})
    

    这就是它!

相关问题