Расчет частичной производной вывода модели Pytorch по отношению к предварительной активации нейроновPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Расчет частичной производной вывода модели Pytorch по отношению к предварительной активации нейронов

Сообщение Anonymous »

Я работаю над важности нейрона для ANNS (в настройке классификации). Простой базовой линейкой является частичная производная вывода модели для правильного класса по отношению к данной предварительной активации нейрона. Моя цель - получить важные нейроны для кластера связанных входов. Таким образом, в настоящее время я просто усредняю ​​импорт для образцов в каждом кластере, чтобы получить импорт каждого кластера. Проблема заключается в том, что я получаю очень небольшие частичные производные для каждого нейрона в среднем, и что результирующие оценки важности не очень хороши в том смысле, что если вы удалите наиболее важные нейроны из модели, производительность модели не уменьшается больше, чем по сравнению с случайным удалением нейронов. Другие методы, такие как использование предварительных активаций в качестве оценки важности, лучше работают в этом отношении. Тем не менее, эксперименты других авторов предполагают, что частичный подход, основанный на производном, должен работать достаточно хорошо во многих условиях. Таким образом, я подозреваю, что в моем коде есть ошибка. < /P>
Моя текущая настройка заключается в следующей. Я знаю, что код не является оптимальным от Performance POV - он написан с учетом ясности. мой вопрос: если в коде есть ошибка для расчета частичных производных в отношении предварительной активации нейронов. Таким образом, последний аргумент в крючке должен быть частичным производным по отношению к предварительной активации. < /P>
class AttributionMethod(ABC):
def __init__(self, model: nn.Module, data_loader: Dict[int, DataLoader]):
self.model = model
self.data_loader = data_loader
if self.model is not None:
self.model.eval()

@abstractmethod
def attribute(self, layer: Module, latent_class: int) -> np.ndarray:
pass

class GradientAttribution(AttributionMethod):
def attribute(self, layer: Module, latent_class: int) -> np.ndarray:
# Calculates the importance scores of the neurons in the provided layer for the provided cluster
device = next(self.model.parameters()).device

inputs, targets = next(iter(self.data_loader[latent_class]))
inputs = inputs.to(device)
targets = targets.to(device)
inputs.requires_grad = True

attributions = []

def hook_fn(module, grad_input, grad_output):
attributions.append(grad_output[0].detach().cpu())

handle = layer.register_full_backward_hook(hook_fn)

# Forward and backward pass
for i in range(len(inputs)):
input_i = inputs.unsqueeze(0) # Add batch dimension
output = self.model(input_i).squeeze()
target_i = targets.item()

output[target_i].backward()
# We do not need to zero the grads since only the model param grads are accumulated

handle.remove()

# Concatenate over batch and average per neuron
grads_tensor = torch.cat(attributions, dim=0)
grads_per_neuron = grads_tensor.mean(dim=0).numpy()
return grads_per_neuron


Подробнее здесь: https://stackoverflow.com/questions/797 ... t-to-neuro
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»