GradientTape方法求导的时候只能对函数的输入参数进行求导吗,为啥训练的例子跟上一节的例子不一样

来源:3-12 tf.GradientTape与tf.keras结合使用

慕哥8458337

2021-01-14

老师您好,我想问一下就是
训练模型时候的梯度下降代码如下:

for epoch in range(epochs):
    metric.reset_states()
    for step in range(steps_per_epoch):
        x_batch, y_batch = random_batch(x_train_scaled, y_train,
                                        batch_size)
        with tf.GradientTape() as tape:
            y_pred = model(x_batch)
            y_pred = tf.squeeze(y_pred, 1)
            loss = keras.losses.mean_squared_error(y_batch, y_pred)
            metric(y_batch, y_pred)
        grads = tape.gradient(loss, model.variables)
        grads_and_vars = zip(grads, model.variables)
        optimizer.apply_gradients(grads_and_vars)

在这里with里面定义的loss函数的输入参数是y_batch和y_pred。
但是求导的对象变成了对model里面的参数(model.variables)求导,可是我看上一节的示例代码都是在with里定义的函数输入参数是啥,求导的时候就对输入的参数求导。
我自己测试了以下,发现对输入参数之外的变量求导会报错,为什么训练模型的时候不会报错呀?
图片描述

写回答

1回答

正十七

2021-01-22

  1. 不管是不是输入,只要是variable就可以被求导

  2. 求导的variable需要在图中,比如,你上面的例子,x2和z没有关系,不在计算图中,所以无法计算,如果你设计一个z和x2的关系式,那么就可以对x2求导了。

0
0

Google老师亲授 TensorFlow2.0 入门到进阶

Tensorflow2.0实战—以实战促理论的方式学习深度学习

1849 学习 · 896 问题

查看课程