Tianket 2022-04-22 16:18
浏览 157
已结题

pytorch 联邦学习fedavg梯度平均 放入字典的值的列表 无法平均

先别走!就是个简单的python问题!先停下来看看吧大爹们
就是个简单的列表和字典的问题

代码1和代码2的输出的global_parameters不同,代码1能正确运行,代码2训练不起来

代码1

local_parameters:每一个客户端的梯度
sum_parameters:将客户端的梯度求和
global_parameters:将所有客户端进行fedavg平均之后的梯度

sum_parameters,local_parameters,global_parameters这三个的键都一样,global_parameters的键已经在前面写好
num_in_comm是个非空非零int型

sum_parameters = None # 先赋为none,方便后面写键值对
for client in clients_in_comm:
    local_parameters = 生成的一个新字典,每次的键都相同,值不同(值是tensor类型的)
    if sum_parameters is None:  # 第一次循环
        sum_parameters = {}  # 先赋为none,方便后面写键值对
        for key, var in local_parameters.items():
            sum_parameters[key] = var.clone()  # 第一次运行,之后运行 键就有了,写入了第一个local_parameters的数据
    else:
        for var in sum_parameters:
            sum_parameters[var] = sum_parameters[var] + local_parameters[var] # 将每个梯度相加

for var in global_parameters:
    global_parameters[var] = (sum_parameters[var] / num_in_comm)  # fedavg 

代码2

和代码1不同是sum_parameters的值是字典而不是每个客户端的和,保存了local_parameters每个键的值
在最后进行加和平均,理论上和代码1的工作是相同的,只是保存了每个客户端单独的梯度

sum_parameters = None
for client in clients_in_comm:
    local_parameters = 生成的一个新字典,每次的键都相同,值不同(值是tensor类型的)
    if sum_parameters is None:
        sum_parameters = {}
        for key, var in local_parameters.items():
            sum_parameters[key] = var.clone()  # 到这里和上面的还相同
        for var in sum_parameters:
            sum_parameters[var] = [sum_parameters[var]]  # sum_parameters的每个值都是个list
    else:  # 之后的循环
        for var in sum_parameters:
            sum_parameters[var].append(local_parameters[var]) #  将每个local_parameters的值添加进list中

for var in global_parameters:
    sum_add=None  # 应为tensor类,先定义为none
    for item in sum_parameters[var]:
        if sum_add==None:
            sum_add=item
        else:
            sum_add=sum_add+item  # 后面的梯度相加
    global_parameters[var] = (sum_add / num_in_comm)
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月30日
    • 修改了问题 4月22日
    • 修改了问题 4月22日
    • 创建了问题 4月22日

    悬赏问题

    • ¥200 csgo2的viewmatrix值是否还有别的获取方式
    • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
    • ¥15 请把下列每一行代码完整地读懂并注释出来
    • ¥15 pycharm运行main文件,显示没有conda环境
    • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
    • ¥15 为什么eclipse不能再下载了?
    • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
    • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
    • ¥15 特定网页无法访问,已排除网页问题
    • ¥50 如何将脑的图像投影到颅骨上