Я работаю над важности нейрона для 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
Расчет частичной производной вывода модели Pytorch по отношению к предварительной активации нейронов ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Каковы различия между предварительной нагрузкой и предварительной фиксацией в HTML?
Anonymous » » в форуме Html - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как легко изменить количество нейронов определенного уровня в нейронной сети тензора?
Anonymous » » в форуме Python - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-