Возьмите среднее значение нескольких факелов. Тензорный список - PullRequest
1 голос
/ 13 февраля 2020

Проект должен многократно повторять данные, а затем усреднять их

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)

. Посоветуйте, пожалуйста, как усреднить несколько градов в списке.

1 Ответ

0 голосов
/ 13 февраля 2020

Я бы сделал это так:

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

Объяснение: zip(*gradslist) сгруппирует соответствующие элементы из каждого списка внутри gradslist, так что в вашем случае это вернет 6 кортежей: один со всеми градиентами w_c1 и один со всеми градиентами b_c1 и так далее. Затем sum(grads)/len(gradslist) вычислит среднее значение для каждого кортежа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...