我想保持跟踪的梯度在tensorboard。然而,由于会话运行语句不再是一件事,并且 tf.keras.callbacks.TensorBoard 的 write_grads 参数已被弃用**,我想知道如何在使用Keras或tensorflow 2.0进行训练期间跟踪梯度。
我目前的方法是为此目的创建一个新的回调类,但没有成功。也许别人知道如何完成这种高级的东西。
为测试创建的代码如下所示,但会出现错误,而与将梯度值打印到控制台或tensorboard无关。
import tensorflow as tf
from tensorflow.python.keras import backend as K
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu', name='dense128'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax', name='dense10')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
class GradientCallback(tf.keras.callbacks.Callback):
console = True
def on_epoch_end(self, epoch, logs=None):
weights = [w for w in self.model.trainable_weights if 'dense' in w.name and 'bias' in w.name]
loss = self.model.total_loss
optimizer = self.model.optimizer
gradients = optimizer.get_gradients(loss, weights)
for t in gradients:
if self.console:
print('Tensor: {}'.format(t.name))
print('{}\n'.format(K.get_value(t)[:10]))
else:
tf.summary.histogram(t.name, data=t)
file_writer = tf.summary.create_file_writer("./metrics")
file_writer.set_as_default()
# write_grads has been removed
tensorboard_cb = tf.keras.callbacks.TensorBoard(histogram_freq=1, write_grads=True)
gradient_cb = GradientCallback()
model.fit(x_train, y_train, epochs=5, callbacks=[gradient_cb, tensorboard_cb])
- 将偏置梯度打印到控制台(控制台参数= True)会导致:错误:“Tensor”对象没有属性“numpy”
- 写入tensorboard(控制台参数= False)创建:类型错误:不允许将
tf.Tensor
用作Pythonbool
。使用if t is not None:
而不是if t:
来测试是否定义了Tensor,并使用tf.cond等TensorFlow操作来执行以Tensor值为条件的子图。
2条答案
按热度按时间kuhbmx9i1#
要计算损失相对于权重的梯度,请使用
这在GradientTape上有记录(可以说很差)。
我们不需要
tape.watch
变量,因为默认情况下会监视可训练参数。作为一个函数,它可以写为
nimxete22#
也看看这里:https://github.com/tensorflow/tensorflow/issues/31542#issuecomment-630495970
我将其改编如下: