知了傳課DRF+Vue實現(xiàn)APl自動化測試平臺
特征提取
通常,我們希望從一個預(yù)先訓(xùn)練好的網(wǎng)絡(luò)中生成特性,然后用它們來完成另一個任務(wù)(例如分類、相似度搜索等)。使用 hook,我們可以提取特征,而不需要重新創(chuàng)建現(xiàn)有模型或以任何方式修改它。
from typing import Dict, Iterable, Callable class FeatureExtractor(nn.Module): ? ? def __init__(self, model: nn.Module, layers: Iterable[str]): ? ? ? ? super().__init__() ? ? ? ? self.model = model ? ? ? ? self.layers = layers ? ? ? ? self._features = {layer: torch.empty(0) for layer in layers} ? ? ? ? for layer_id in layers: ? ? ? ? ? ? layer = dict([*self.model.named_modules()])[layer_id] ? ? ? ? ? ? layer.register_forward_hook(self.save_outputs_hook(layer_id)) ? ? def save_outputs_hook(self, layer_id: str) -> Callable: ? ? ? ? def fn(_, __, output): ? ? ? ? ? ? self._features[layer_id] = output ? ? ? ? return fn ? ? def forward(self, x: Tensor) -> Dict[str, Tensor]: ? ? ? ? _ = self.model(x) ? ? ? ? return self._features