TF Kera API错误阻止对自定义图层进行渐变更新

2020-07-15 10:30:49

TL';DR:对于使用过带自定义层的Functional API的任何人来说,它可能值得运行。

将自定义层与Functional API一起使用会导致Training_Variables中缺少权重。这些权重也不在NON_TRANABLE_VARIABLES中。

但是,如果这些权重不在Training_Variables中,则它们基本上是冻结的,因为只有那些权重才会接收渐变更新,如下面的KERAS模型培训代码中所示:

GRADIES=磁带。GRADIATE(LASS,TRANSABLE_VARIABLES)#是否在优化器外部聚合梯度。这需要优化器的#支持,并且不能与ParameterServerStrategy和#CentralStroageStrategy一起使用。Aggregate_Grads_Outside_Optimizer=(Optimizer._Has_Aggregate_Grad and#pylint:DISABLE=PROTECTED-ACCESS NOT IS INSTANCE(Strategy y.Extended,parameter_server_strategy.ParameterServerStrategyExtended))if Aggregate_Grads_Outside_Optimizer:#如果#LossScaleOptimizer All-Reduced的子类在fp16中),我们在取消缩放渐变之前先聚合它们。为了数值稳定性,FP16中的所有减少只能在缩放的渐变上进行#,而不能在未缩放的渐变上进行。GRADIANCES=优化器。_AGGREGATE_GRADIANCES(zip(GRADIONS,#pylint:DISABLE=PROTECTED-ACCESS TRANSABLE_VARIABLES))if isinstance(Optimizer,lso.LossScaleOptimizer)。

这个要点使用转换器库来创建模型,因此很容易看到错误。为了深入了解,下面的CoLab要点从头开始创建所有自定义图层。

正如您在笔记本中看到的,一种解决方法是使用keras子类化创建模型;模型子类化会导致所有权重都显示在TRANABLE_VARIABLES中。为了绝对确保功能API和子类模型完全相同,我在每个笔记本底部使用相同的输入对它们运行推理;模型的输出完全相同。但是使用函数API模型的训练会将许多权重视为冻结的(并且没有办法使它们解冻,因为这些权重也没有注册在NON_TRANABLE_VARIABLES中)。

我已经关注这个问题大约一个月了,据我所知,我不认为我创建的转换器层有什么独特之处;任何使用自定义子层和函数API的Kera模型都可能出现这种情况。

我在24天前发布了一期Github,但我不知道这是不是正在进行中的事情。

如果其他任何人一直在使用带自定义层的Kera Functional API,您在检查可培训变量时是否也会遇到同样的问题。