[Pytorch] Ищите векторизованную реализацию - PullRequest
0 голосов
/ 09 сентября 2018

Вот мой код, 'x' - это обычный вес CNN с размером: (out_c, in_c, k_h, k_w), где out_c также является номером ядра CNN. фунт (нижняя граница) и уб (верхняя связь) - это два предопределенных массива 1D numpy длиной out_c .

Задача состоит в том, чтобы убедиться, что значения всех весов ядра CNN находятся в пределах диапазона, определенного фунт и ub (то есть фунт [i] <<strong> x [i,:,:,:] <<strong> ub [i] , 0 <= <strong>i <<strong> out_c ) путем отсечения все выбросы. Кроме того, мне нужно сохранить маску выбросов для другого использования.

Тем не менее, я не могу найти полностью векторизованное решение, в котором не используется цикл for. Я использую Pytorch 0.3.1, есть ли способ сделать этот сегмент кода полностью векторизованным (избавиться от цикла for)? Спасибо.

N = x.size(0) # number of cnn kernel
lower_mask = []
upper_mask = []
for i in range(N):
    lower_mask.append(x[i] < lb.tolist()[i])
    upper_mask.append(ub.tolist()[i] < x[i])
    x[i].clamp_(lb.tolist()[i], ub.tolist()[i])
lower_mask = torch.stack(lower_mask).cuda()
upper_mask = torch.stack(upper_mask).cuda()
...