Python 使用tensorflow.keras 2.0更新,添加_loss()以规范层活动/权重不再起作用

Python 使用tensorflow.keras 2.0更新,添加_loss()以规范层活动/权重不再起作用,python,tensorflow2.0,tf.keras,regularized,Python,Tensorflow2.0,Tf.keras,Regularized,我之前在一个预训练网络上,使用层上循环,在Tensorflow.keras中添加激活和/或内核的正则化: if regl\u什么是“内核”: 对于model.layers中的图层: 如果isinstance(图层,深度CONV2D): 层。添加损失(正则化子。l1层(l1层,l2层)(层。深度内核)) elif isinstance(layer,layers.Conv2D)或isinstance(layer,layers.Dense): layer.add_loss(正则化子.l1_l2(l1,

我之前在一个预训练网络上,使用层上循环,在Tensorflow.keras中添加激活和/或内核的正则化:

if regl\u什么是“内核”:
对于model.layers中的图层:
如果isinstance(图层,深度CONV2D):
层。添加损失(正则化子。l1层(l1层,l2层)(层。深度内核))
elif isinstance(layer,layers.Conv2D)或isinstance(layer,layers.Dense):
layer.add_loss(正则化子.l1_l2(l1,l2)(layer.kernel))
如果“活动”是什么:
对于model.layers中的图层:
如果存在(层,激活):
层添加损耗(正则化器.l1\ul2(l1,l2)(层输出))
在升级到tensorflow 2.0之前,它曾经正常工作(据我测试)

现在我需要将整个框架更新为tensorflow 2.0。上一个代码在执行时,在应用add_loss()时返回以下错误:

---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
3如果(层名称中的“U relu”):#isinstance(层,激活):
4#layer.activity_regularizer=正则化器。l1_l2(l1,l2)
---->5层。添加损耗(正则化器。l1层(l1,l2)(层。输出))
添加损耗(self、损耗、输入)中的~/miniconda/envs/l1l2/lib/python3.6/site-packages/tensorflow\u core/python/keras/engine/base\u layer.py
1119如果迫不及待的损失而不在呼叫上下文中:
1120提升值错误(
->1121“损失值应为符号张量或可调用。”
1122'请将损失计算包装在零参数'lambda'。)
1123
ValueError:丢失值应为符号张量或可调用。请将损失计算包装在零参数“lambda”中。
因此,我尝试如下介绍零参数lambda函数:

if regl\u什么是“内核”:
对于model.layers中的图层:
如果isinstance(图层,深度CONV2D):
layer.add_loss(lambda:regulatories.l1_l2(l1,l2)(layer.depthways_kernel))
elif isinstance(layer,layers.Conv2D)或isinstance(layer,layers.Dense):
layer.add_loss(lambda:regulatories.l1_l2(l1,l2)(layer.kernel))
如果“活动”是什么:
对于model.layers中的图层:
如果存在(层,激活):
layer.add_损失(lambda:regulatories.l1_l2(l1,l2)(layer.output))
随着lambda的引入,add_loss循环无误通过,但当培训开始时,我得到错误:

文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/tensorflow\u core/python/keras/engine/training.py”,第1297行,在fit\u生成器中
步骤(名称=“每个时代的步骤”)
文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/tensorflow\u core/python/keras/engine/training\u generator.py”,第295行,在模型迭代中
批处理结束时的程序条(步骤、批处理日志)
文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/tensorflow\u core/python/keras/callbacks.py”,第760行,在“批处理”末尾
self.progbar.update(self.seen、self.log\u值)
更新中的第440行文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/tensorflow\u core/python/keras/utils/generic\u utils.py”
平均值=np.平均值(自身值[k][0]/最大值(1,自身值[k][1]))
文件“”,第6行,平均值
文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/numpy/core/fromneric.py”,第3257行,平均值
out=out,**kwargs)
文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/numpy/core/_methods.py”,第135行,单位为
arr=asanyarray(a)
asanyarray中的文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/numpy/core/_asarray.py”,第138行
返回数组(a,dtype,copy=False,order=order,subok=True)
文件“~/miniconda/envs/l1l2/lib/python3.6/site packages/tensorflow\u core/python/framework/ops.py”,第736行,在数组中__
“数组。”.format(self.name))
NotImplementedError:无法将符号张量(truediv:0)转换为numpy数组。

我不知道怎么解决这个问题。。。提前感谢您的帮助

问题似乎实际上是由于TF2.0中的默认急切执行造成的

通过在脚本开头使用以下行禁用即时执行:

将tensorflow导入为tf
tf.compat.v1.disable_eager_execution()
。。原始版本(不含lambda)运行平稳


此处还提到了急切执行和add_loss()之间的不兼容性:

似乎问题实际上是由于TF2.0中的默认急切执行造成的

通过在脚本开头使用以下行禁用即时执行:

将tensorflow导入为tf
tf.compat.v1.disable_eager_execution()
。。原始版本(不含lambda)运行平稳

此处还提到了急切执行和添加_loss()之间的不兼容性: