我正在尝试从keras模型中获得渐变。后端函数keras.backend.gradients创建一个符号函数,需要在某些特定输入上对其进行评估。以下代码确实可以解决此问题,但它利用了旧的tensorflow会话,尤其是feed_dict。
import numpy as np
import keras
from keras import backend as K
import tensorflow as tf
model = keras.Sequential()
model.add(keras.layers.Dense(16, activation='relu', input_shape = (49, )))
model.add(keras.layers.Dense(11, activation='softmax'))
model.compile(optimizer='rmsprop', loss='mse')
trainingExample = np.random.random((1, 49))
gradients = K.gradients(model.output, model.trainable_weights)
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
evaluated_gradients = sess.run(gradients,\
feed_dict={model.input:trainingExample})
sess.close()
我如何以tensorflow 2样式重写此代码,即没有会话?有一种描述的替代方法here。但是我不明白为什么必须给出一些明确的输出来评估梯度,以及如何在没有这些输出的情况下使解决方案起作用。
在tensorflow-2中,您可以使用渐变tf.GradientTape()非常容易地获得渐变。
我在这里引用了官方教程代码-
@tf.function
def train_step(images, labels):
with tf.GradientTape() as tape:
predictions = model(images)
loss = loss_object(labels, predictions)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
train_loss(loss)
train_accuracy(labels, predictions)
您可以在tensorflow官方网站上找到完整的教程-https://www.tensorflow.org/tutorials/quickstart/advanced