如何使用张量流2从keras模型中获得评估的梯度?

问题描述 投票:0回答:1

我正在尝试从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 keras
1个回答
0
投票

在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

© www.soinside.com 2019 - 2024. All rights reserved.