Mat*_*t S 30 python theano keras
我有兴趣用Keras API的简单性构建强化学习模型.不幸的是,我无法提取关于权重的输出的梯度(而不是错误).我发现以下代码执行类似的功能(神经网络的显着性图(使用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])
Run Code Online (Sandbox Code Playgroud)
关于如何根据每层的权重计算模型输出的梯度的任何想法都将被理解.
Mat*_*t S 36
要使用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'])
Run Code Online (Sandbox Code Playgroud)
要计算梯度,我们首先需要找到输出张量.对于模型的输出(我的初始问题是什么),我们只需调用model.output.我们还可以通过调用model.layers [index] .output找到其他层的输出梯度
outputTensor = model.output #Or model.layers[index].output
Run Code Online (Sandbox Code Playgroud)
然后我们需要选择与梯度有关的变量.
listOfVariableTensors = model.trainable_weights
#or variableTensors = model.trainable_weights[0]
Run Code Online (Sandbox Code Playgroud)
我们现在可以计算梯度.它很简单如下:
gradients = k.gradients(outputTensor, listOfVariableTensors)
Run Code Online (Sandbox Code Playgroud)
要实际运行给定输入的渐变,我们需要使用一点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})
Run Code Online (Sandbox Code Playgroud)
就是这样!
| 归档时间: |
|
| 查看次数: |
18465 次 |
| 最近记录: |