问题描述
collected_output=tff.federated_collect(client_outputs)
。
详细代码请参考此question。
我的问题是照片上用红色标记的部分之间的区别。就 FL 算法而言,我认为 client_outputs
是单个客户端的输出,而 collected_output
是 SequenceType
,因为每个 client_outputs
是组合在一起的。这样对吗?如果我的猜测是正确的,member
是一组带有 client_outputs
的单个客户成员吗?
解决方法
这个术语可能有点棘手。 client_outputs
不完全是“单个客户的输出”,它仍然代表所有 客户输出,但它们不能单独寻址。重要的是,TFF 区分数据存在(“放置”)在客户端,它没有被传达。 collected_outputs
在某种意义上是所有单个客户端输出的流,尽管 位置 已更改(值已通过 tff.federated_collect
传送到服务器)。
再详细一点:
在上面的类型规范中,.member
是 tff.FederatedType
上的一个属性。 TFF 指南 Federated Core > Type System 是有关不同 TFF 类型的更多详细信息的好资源。
{int32}@CLIENTS
表示由一组可能不同的整数组成的联合值,每个客户端设备一个。请注意,我们所说的单个联合值包含出现在网络中多个位置的多个数据项。可以将其视为一种具有“网络”维度的张量,尽管这种类比并不完美,因为 TFF 不允许随机访问联合值的成员组成部分。
在屏幕截图中,client_outputs
也被“放置”了 @CLIENTS
(来自 .placement
属性)并遵循类似的语义:它有多个值(每个客户端一个)但单个值是不可寻址(即该值的行为不像 Python list
)。
相反,collected_output
放在 @SERVER
。那么这个子弹:
<weights=float32[10,5],bias=float32[5]>@SERVER
表示服务器上的权重和偏置张量的命名元组。由于我们去掉了大括号,这表明设置了 all_equal 位,即只有一个元组(无论托管该值的集群中可能有多少服务器副本)。
注意“single tuple”短语,在 tff.federated_collect
之后有一个值序列放置在服务器上。这个序列可以像 stream 一样迭代。