Keras 找不到权重的梯度 WARNING:tensorflow:Gradients do not exist for variables when minimizing the loss

 

问题:

在构建复数网络的时候,需要按照实部real与虚部image来分别创建计算权重:

shape = (2,) + (input_dim, self.units)     # dense层构建全连接矩阵
self.kernel = self.add_weight(shape = shape,
                              initializer = self.kernel_initializer,
                              name = 'kernel',
                              regularizer = self.kernel_regularizer,
                              constraint = self.kernel_constraint)
self.kernel_real = self.kernel[0]
self.kernel_image = self.kernel[1]

 在weight的shape上添加了(2,)来生成,再使用weight[0], weight[1]来拆分得到两个weight,  

  拆分的行为会导致bp时无法求得gradient,导致梯度消失无法更新权重。

  解决办法:

   分别生成权重,去除拆分矩阵的步骤

kernel_shapes = (input_units, self.output_units)
self.kernel_real = self.add_weight(shape=kernel_shapes,
                                   initializer=self.kernel_initializer_real,
                                   name='kernel_real',
                                   constraint=self.kernel_constraint)
self.kernel_image = self.add_weight(shape=kernel_shapes,
                                    initializer=self.kernel_initializer_image,
                                    name='kernel_image',
                                    regularizer=self.kernel_regularizer,
                                    constraint=self.kernel_constraint)

应该还有一些其他类似原因导致此问题,但感觉都是大同小异,很多时候因为进行了无法进行求导的操作。 

其他解释参考:https://blog.csdn.net/weixin_37913042/article/details/115428695

情况一
该变量没有参与最后loss的计算

(1)如果直接没有参与计算,其实很好就能找出来,删掉无用变量即可;
(2)有时直接参与计算了,但是由于程序中的 if 等条件语句,在某个batch的数据恰巧不适用某个变量,而其他batch可能就是使用了该变量,这种情况下,忽略该警告即可。

情况二
该变量在 model 的 call 之前就进行了运算,或者在 tf.GradientTape() 之外进行了运算,比如:concat,dense之类的都不行。

情况三
错误写法:
创建一个变量或者常量,将计算出的结果一行一行 assign 进去
修改后的写法:
创建一个空 list,每次将计算出的结果 append 加入,最后使用 tf.stack() 操作
————————————————
版权声明:本文为CSDN博主「cici_iii」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37913042/article/details/115428695

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值