Механизм обрезки нейронной сети - PullRequest
0 голосов
/ 29 декабря 2018

Я работаю над SqueezeNet обрезка .У меня есть несколько вопросов, касающихся кода для обрезки , основанного на статье: ОБРАБОТКА СВОБОДНЫХ НЕЙРОННЫХ СЕТЕЙ ДЛЯ ЭФФЕКТИВНОГО ВОЗДЕЙСТВИЯ РЕСУРСОВ

def compute_rank(self, grad):
    activation_index = len(self.activations) - self.grad_index - 1
    activation = self.activations[activation_index]
    values = \
        torch.sum((activation * grad), dim = 0, keepdim=True).\
            sum(dim=2, keepdim=True).sum(dim=3, keepdim=True)[0, :, 0, 0].data

    values = \
        values / (activation.size(0) * activation.size(2) * activation.size(3))

    if activation_index not in self.filter_ranks:
        self.filter_ranks[activation_index] = \
            torch.FloatTensor(activation.size(1)).zero_().cuda()

    self.filter_ranks[activation_index] += values
    self.grad_index += 1

1) Почему ' значения 'использует только in_height (2) и in_width (3) активации?Как насчет in_channels (1)?

2) Почему filter_ranks [активации_index] зависит только от in_channels (1)?

3) Почему активация умножается на градиент?и зачем их подводить?

1 Ответ

0 голосов
/ 30 декабря 2018

Большая активация указывает на то, что этот фильтр предоставляет важные функции.

Большой град показывает, что этот фильтр чувствителен к различным типам ввода

Фильтры с большой активацией и большим градом важныи не удаляется

Сумма объясняется тем, что можно удалить только весь фильтр

Это обоснованное предположение для вопроса 3)

Пожалуйста, исправьте меня, если ошиблись.

...