Как векторизовать сумму?тензор [i,:,:,:] + тензор [i] - PullRequest
1 голос
/ 25 июня 2019

Я хочу векторизовать следующий код:

def style_noise(self, y, style):
    n = torch.randn(y.shape)
    for i in range(n.shape[0]):
        n[i] = (n[i] - n.mean(dim=(1, 2, 3))[i]) * style.std(dim=(1, 2, 3))[i] / n.std(dim=(1, 2, 3))[i] + style.mean(dim=(1, 2, 3))[i]
    noise = Variable(n, requires_grad=False).to(y.device)
    return noise

Я не нашел способ сделать это.

y и style являются 4d-тензорами, скажем style.shape = y.shape = [64, 3, 128, 128].

Я хочу вернуть тензор шума, noise.shape = [64, 3, 128, 128].

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

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Чтобы вычислить среднее значение и стандартное отклонение для всего тензора, вы не устанавливаете аргументы

m = t.mean(); print(m) # if you don't set the dim for the whole tensor
s = t.std(); print(s) # if you don't set the dim for the whole tensor

Тогда, если ваша фигура, например, 2,2,2, создайте тензоры для широковещательного вычитания и деления.

ss = torch.empty(2,2,2).fill_(s)
print(ss)

mm = torch.empty(2,2,2).fill_(m)
print(mm)

В настоящее время keepdim не работает должным образом, если вы не установили dim.

m = t.mean(); print(m) # for the whole tensor
s = t.std(); print(s) # for the whole tensor

m = t.mean(dim=0); print(m) # 0 means columns mean
s = t.std(dim=0); print(s) # 0 means columns mean

m = t.mean(dim=1); print(m) # 1 means rows mean
s = t.std(dim=1); print(s) # 1 means rows mean

s = t.mean(keepdim=True);print(s) # will not work
m = t.std(keepdim=True);print(m) # will not work

Если вы установите dim в качестве кортежа, то он вернет среднее значение для осей, вы спрашивали не для целого.

1 голос
/ 25 июня 2019

В вашем случае использования именно поэтому методы .mean и .std имеют параметр keepdim.Вы можете использовать это для включения семантики вещания для векторизации вещей для вас:

def style_noise(self, y, style):
    n = torch.randn(y.shape)
    n_mean = n.mean(dim=(1, 2, 3), keepdim=True)
    n_std = n.std(dim=(1, 2, 3), keepdim=True)
    style_mean = style.mean(dim=(1, 2, 3), keepdim=True)
    style_std = style.std(dim=(1, 2, 3), keepdim=True)
    n = (n - n_mean) * style_std / n_std + style_mean
    noise = Variable(n, requires_grad=False).to(y.device)
    return noise
...