繁体   English   中英

取多 torch.Tensor 列表的平均值

[英]Take the mean of multi torch.Tensor list

项目需要对数据进行多次迭代,然后取平均值

gradslist = []
for data_epoch in interval_steps:
    output = cnn.forward(b_x)[0] 
    loss = nn.CrossEntropyLoss()(output, b_y)
    cnn.zero_grad()  
    loss.backward()    
    w_c1 = cnn.conv1[0].weight.grad
    b_c1 = cnn.conv1[0].bias.grad
    w_c2 = cnn.conv2[0].weight.grad
    b_c2 = cnn.conv2[0].bias.grad
    w_o = cnn.out.weight.grad
    b_o = cnn.out.bias.grad       
    grads = [w_c1,b_c1,w_c2,b_c2,w_o,b_o]
    gradslist.append(grads)
w_c1 type= torch.Tensor  shape=  torch.Size([64, 1, 5, 5])  
b_c1 type= torch.Tensor  shape=  torch.Size([64])  
w_c2 type= torch.Tensor  shape=  torch.Size([144, 64, 5, 5])  
b_c2 type= torch.Tensor  shape=  torch.Size([144])  
w_o type= torch.Tensor  shape=  torch.Size([10, 2304])  
b_o type= torch.Tensor  shape=  torch.Size([10])  

我想要平均值

avggrads = [avg_w_c1, avg_b_c1, avg_w_c2, avg_b_c2, avg_w_o, avg_w_0]

avggrads 的结果不是一个值列表,而是一个torch.tensor 列表,比如avg_w_c1.shape= torch.size([64, 1, 5, 5]),而不是一个值。 它是corresponding position (Matrix averaging)的平均值corresponding position (Matrix averaging)

请告知如何在 gradslist 中平均多个 grads。

我会这样做:

avggrads = [sum(grads)/len(gradslist) for grads in zip(*gradslist)]

说明: zip(*gradslist)意愿组从内的每个列表中的相应元件一起gradslist ,所以在你的情况下,它会返回6元组:一个与所有的梯度w_c1和一个用于所有的梯度b_c1等。 然后sum(grads)/len(gradslist)将计算每个元组的平均值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM