gpt4 book ai didi

python - 如何使用 keras.backend.gradients() 获取梯度值

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:41 26 4
gpt4 key购买 nike

我正在尝试获取 Keras 模型输出相对于模型输入 (x)(而非权重)的导数。似乎最简单的方法是使用 keras.backend 中的“梯度”,它返回梯度张量 ( https://keras.io/backend/ )。我是 tensorflow 的新手,还不太适应。我有梯度张量,并尝试为不同的输入值 (x) 获取数值。但似乎梯度值与输入 x 无关(这不是预期的)或者我做错了什么。任何帮助或意见将不胜感激。

import keras
import numpy as np
import matplotlib.pyplot as plt
from keras.layers import Dense, Dropout, Activation
from keras.models import Sequential
import keras.backend as K
import tensorflow as tf
%matplotlib inline

n = 100 # sample size
x = np.linspace(0,1,n) #input
y = 4*(x-0.5)**2 #output
dy = 8*(x-0.5) #derivative of output wrt the input
model = Sequential()
model.add(Dense(32, input_dim=1, activation='relu')) # 1d input
model.add(Dense(32, activation='relu'))
model.add(Dense(1)) # 1d output

# Minimize mse
model.compile(loss='mse', optimizer='adam', metrics=["accuracy"])
model.fit(x, y, batch_size=10, epochs=1000, verbose=0)

gradients = K.gradients(model.output, model.input) #Gradient of output wrt the input of the model (Tensor)
print(gradients)

#value of gradient for the first x_test
x_test_1 = np.array([[0.2]])
sess = tf.Session()
sess.run(tf.global_variables_initializer())
evaluated_gradients_1 = sess.run(gradients[0], feed_dict={model.input:
x_test_1})
print(evaluated_gradients_1)

#value of gradient for the second x_test
x_test_2 = np.array([[0.6]])
evaluated_gradients_2 = sess.run(gradients[0], feed_dict={model.input: x_test_2})
print(evaluated_gradients_2)

我的代码输出:

[<tf.Tensor 'gradients_1/dense_7/MatMul_grad/MatMul:0' shape=(?, 1) dtype=float32>]
[[-0.21614937]]
[[-0.21614937]]

evaluated_gradients_1 和 evaluated_gradients_2 对于不同的运行是不同的,但总是相等的!我预计它们在同一次运行中会有所不同,因为它们针对不同的输入值 (x)。网络的输出似乎是正确的。这是网络输出图:Output of the network vs. true value

最佳答案

答案如下:

sess = tf.Session()
sess.run(tf.global_variables_initializer())

应替换为:

sess = K.get_session()

前者创建一个新的tensorflow session 并初始化所有值,这就是为什么它给出随机值作为梯度函数的输出。后者拉出Keras内部使用的session,具有训练后的值(value)。

关于python - 如何使用 keras.backend.gradients() 获取梯度值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54566337/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com