python - Tensorflow:“错误:没有为任何变量提供梯度”,带有自定义损失
问题描述
当我尝试运行我的代码时出现错误
ValueError: No gradients provided for any variable
这是我的代码的样子
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-2)
while True:
#...other stuff
if(isTimeToBackprop()):
vStates = model.predict(modelInput)
tdTargets = tf.ones(vStates.shape)
loss = tf.math.reduce_mean(tf.math.squared_difference(vStates, tdTargets))
callable = lambda : criticLoss
optimizer.minimize(callable, var_list=model.trainable_variables)
所有涉及的变量都是类型
<class 'tensorflow.python.framework.ops.EagerTensor'>
我有什么误解?
解决方案
假设您正在使用 Tensorflow 2.x,如果您尝试创建自定义训练步骤以跟踪模型梯度,则必须在tf.GradientTape
上下文管理器下调用模型。
在这里,您已更新代码以正确使用GradientTape
:
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-2)
while True:
#...other stuff
if isTimeToBackprop():
with tf.GradientTape() as tape:
vStates = model(modelInput)
tdTargets = tf.ones(vStates.shape)
loss = tf.math.squared_difference(vStates, tdTargets)
loss = tf.reduce_mean(loss)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_weights))
# At this point the model is updated
另请注意,我没有使用 model.predict,而是使用call方法,这是您在训练时应该使用的方法
推荐阅读
- css - 是否可以将 box-shadow 用于 .header-main-wrap?
- python - 使用python连接kafka和elasticsearch
- assembly - JA和JNBE在汇编中的区别
- python - 使用 BeautifulSoup 抓取只能让我从无限滚动页面中获得 33 个响应。如何增加回复的数量?
- tableau-api - 缩略图停止出现在我的 Tableau Public 个人资料中
- javascript - 如何将 Nodejs 中的构建文件夹指向 NextJS 应用程序以部署在 cPanel 上?
- react-native-web - 如何在 React Native for Web 中管理每个容器的滚动
- php - Api多次请求httpful.phar致命错误
- node.js - req cookies undefined express
- javascript - React:带有样式的文本编辑器。(状态和 UI 分开)