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
不管是不是输入,只要是variable就可以被求导
求导的variable需要在图中,比如,你上面的例子,x2和z没有关系,不在计算图中,所以无法计算,如果你设计一个z和x2的关系式,那么就可以对x2求导了。
00
相似问题
为什么每次的训练结果都不一样呢?
回答 2
请教一个交叉验证的问题
回答 1