【问题】【KERAS】【Tensorflow】关于tensorflow中的梯度为None的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Laox1ao/article/details/79053808

错误

ValueError: None values not supported.

错误原因

往前追溯Traceback

/Users/laox1ao/anaconda/lib/python2.7/site-packages/keras/engine/training.pyc in _make_train_function(self)
    988                     training_updates = self.optimizer.get_updates(
    989                         params=self._collected_trainable_weights,
--> 990                         loss=self.total_loss)
    991                 updates = self.updates + training_updates
    992                 # Gets loss and metrics. Updates weights at each call.

是由于网络存在ops的梯度为None,导致图的梯度流断裂(disconnected),检查发现是keras.backend.switch操作在以tensorflow为backend的情况下无法计算梯度,tf.gradients()返回结果为None。

解决方法

由于switch的操作无法进行梯度回传,便寻求能替代的函数:

tf.where  ##尝试了,同样无法解决,但是google得到where函数是有梯度的,不解
tf.clip(x-y,min,max)  ##从逻辑上该用clip函数来代替,解决,说明clip函数实现了梯度

还查阅到,关于tf中操作是否具有或者是否实现了梯度,可从math_grad.py原文件中查看,或者使用tf.gradients()验证

猜你喜欢

转载自blog.csdn.net/Laox1ao/article/details/79053808
今日推荐