[英]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.