python - TensorFlow从1升级到2,突然出现“没有为任何变量提供梯度”
问题描述
我的主要问题是,当损失函数没有改变时,升级如何导致“没有为任何变量提供梯度”错误?
我正在将代码库从 TensorFlow 1 升级到 TensorFlow 2。我已经升级了包,并tensorflow.compat.v1
在过渡期间使用,并且不时切换。(另外值得一提的是,我没有写原始代码,对TensorFlow也不是很熟悉,所以答案可能很简单。)
该代码使用一个优化器;
tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate, use_locking=True)
我认为我可以通过用新的类名替换它来简单地升级这部分;
tf.keras.optimizers.Adam(learning_rate=learning_rate)
但很可惜,这行不通!当代码去使用优化器时;
optimizer.minimize(loss)
我遇到了一些问题。一是,由于不再有惰性求值,损失函数必须是 lambda。这很容易解决;
optimizer.minimize(lambda: loss)
但是,我明白了minimize() missing 1 required positional argument: 'var_list'
。但是我原来的 tf 1 调用没有传入变量,那么我现在怎么需要传入它们呢?我尝试var_list=None
,这会引发另一个错误。然后我尝试var_list=[]
,它实际上运行,但结果完全不同,所以我确定它是错误的。然后我发现如果你不在 tf 1 中传递 vars,它默认使用tf.compat.v1.trainable_variables()
. 所以我在调用之前使用 pdb 调用该函数minimize
,发现它确实返回了一个变量,称为A_control
. 那我试试;
optimizer.minimize(lambda: loss, var_list=[A_control])
但这给了我同样的“没有提供渐变”错误。
经过一段时间的调试失败后,我决定尝试将代码库的其余部分从 tf 1 升级。我更改了代码流以考虑急切的评估,我删除了所有会话的使用,我替换了所有其他的使用,tf.compat.v1
并且没有-更需要的方法。
在多次调试迭代中运行代码后,我终于开始执行optimizer.minimize
并且仍然得到错误;
ValueError: No gradients provided for any variable: ['A_control:0'].
那么有什么关系呢?相同的损失函数怎么可能在之前但之后没有梯度?而且,如果我必须手动更改它,我该如何确定我必须更改的部分?
解决方案
推荐阅读
- ios - FirebaseUI 无法通过 Facebook 进行身份验证
- android - Not able to use HTML text in setText of collapsing Toolbar in android?
- c# - convert unicode(hex) to string in C#
- c# - Unity RegisterType() Error: there is no implicit reference conversion
- json - Error: Cannot read property 'name' of undefined while creating Nested Json Object in Node Js
- docker - 容器镜像名称未从镜像本身转移
- javascript - Insert Javascript on every page of the site(s)
- ruby - Mongoid 为什么我应该使用 update_all 而不是简单地循环收集和保存
- java - Java 日期间隔中的动态查询
- sql - 连续付款的客户