启用Eager Execution后仍报错:TensorFlow Federated权重处理问题
NotImplementedError: numpy() is only available when eager execution is enabled错误 核心冲突:TFF执行模型与原生TF Eager模式的不兼容
TFF的底层执行逻辑基于TensorFlow计算图模式设计,它会把联邦学习全流程(客户端训练、服务器聚合等)打包成可分布式执行的联邦计算图,运行时完全在TFF自身的执行上下文里,和你手动启用的tf.compat.v1.enable_eager_execution()环境相互独立。你开头启用的Eager模式仅对本地预处理代码生效,但调用tff.learning.algorithms.build_weighted_fed_avg时,TFF会自动切换到计算图模式序列化模型逻辑,此时如果processing_work函数里存在.numpy()调用,或者给模型层赋值时触发了Tensor到numpy数组的隐式转换,就会在非Eager的计算图环境中触发该错误。
权重处理方式不符合TFF的序列化要求
手动提取模型权重→处理→重新赋值的操作在原生TF Eager环境中可行,但TFF要求所有涉及模型权重的操作必须是可序列化的计算图操作,不能包含手动的Eager式赋值(比如直接调用layer.weight.assign(processed_tensor)、将numpy数组直接赋值给层参数)。这类手动操作会破坏TFF对模型逻辑的序列化过程,当TFF尝试将模型逻辑打包成联邦计算图时,会触发非Eager环境下的numpy转换操作,进而报错。
ResourceVariable的误区
将处理后的Tensor转为ResourceVariable也无法解决问题,因为TFF构建联邦平均算法时,会自动将模型变量转换为自身定义的联邦变量表示,不会直接使用你本地创建的ResourceVariable。如果预处理逻辑用Eager模式修改了这些变量,TFF序列化时会尝试将变量转换为计算图张量,此时若变量中存在依赖Eager的numpy操作,依然会触发错误。
内容的提问来源于stack exchange,提问作者CA Khan

