網站首頁 編程語言 正文
【1】方法一:獲取nn.Sequential的中間層輸出
import torch import torch.nn as nn model = nn.Sequential( ? ? ? ? ? ? nn.Conv2d(3, 9, 1, 1, 0, bias=False), ? ? ? ? ? ? nn.BatchNorm2d(9), ? ? ? ? ? ? nn.ReLU(inplace=True), ? ? ? ? ? ? nn.AdaptiveAvgPool2d((1, 1)), ? ? ? ? ) # 假如想要獲得ReLu的輸出 x = torch.rand([2, 3, 224, 224]) for i in range(len(model)): ? ? x = model[i](x) ? ? if i == 2: ? ? ? ? ReLu_out = x print('ReLu_out.shape:\n\t',ReLu_out.shape) print('x.shape:\n\t',x.shape)
結果:
ReLu_out.shape:
? torch.Size([2, 9, 224, 224])
x.shape:
? torch.Size([2, 9, 1, 1])
【2】方法二:IntermediateLayerGetter
from collections import OrderedDict ? import torch from torch import nn ? ? class IntermediateLayerGetter(nn.ModuleDict): ? ? """ ? ? Module wrapper that returns intermediate layers from a model ? ? It has a strong assumption that the modules have been registered ? ? into the model in the same order as they are used. ? ? This means that one should **not** reuse the same nn.Module ? ? twice in the forward if you want this to work. ? ? Additionally, it is only able to query submodules that are directly ? ? assigned to the model. So if `model` is passed, `model.feature1` can ? ? be returned, but not `model.feature1.layer2`. ? ? Arguments: ? ? ? ? model (nn.Module): model on which we will extract the features ? ? ? ? return_layers (Dict[name, new_name]): a dict containing the names ? ? ? ? ? ? of the modules for which the activations will be returned as ? ? ? ? ? ? the key of the dict, and the value of the dict is the name ? ? ? ? ? ? of the returned activation (which the user can specify). ? ? """ ? ?? ? ? def __init__(self, model, return_layers): ? ? ? ? if not set(return_layers).issubset([name for name, _ in model.named_children()]): ? ? ? ? ? ? raise ValueError("return_layers are not present in model") ? ? ? ? ? orig_return_layers = return_layers ? ? ? ? return_layers = {k: v for k, v in return_layers.items()} ? ? ? ? layers = OrderedDict() ? ? ? ? for name, module in model.named_children(): ? ? ? ? ? ? layers[name] = module ? ? ? ? ? ? if name in return_layers: ? ? ? ? ? ? ? ? del return_layers[name] ? ? ? ? ? ? if not return_layers: ? ? ? ? ? ? ? ? break ? ? ? ? ? super(IntermediateLayerGetter, self).__init__(layers) ? ? ? ? self.return_layers = orig_return_layers ? ? ? def forward(self, x): ? ? ? ? out = OrderedDict() ? ? ? ? for name, module in self.named_children(): ? ? ? ? ? ? x = module(x) ? ? ? ? ? ? if name in self.return_layers: ? ? ? ? ? ? ? ? out_name = self.return_layers[name] ? ? ? ? ? ? ? ? out[out_name] = x ? ? ? ? return out
# example m = torchvision.models.resnet18(pretrained=True) # extract layer1 and layer3, giving as names `feat1` and feat2` new_m = torchvision.models._utils.IntermediateLayerGetter(m,{'layer1': 'feat1', 'layer3': 'feat2'}) out = new_m(torch.rand(1, 3, 224, 224)) print([(k, v.shape) for k, v in out.items()]) # [('feat1', torch.Size([1, 64, 56, 56])), ('feat2', torch.Size([1, 256, 14, 14]))]
作用:
在定義它的時候注明作用的模型(如下例中的m)和要返回的layer(如下例中的layer1,layer3),得到new_m。
使用時喂輸入變量,返回的就是對應的layer
。
舉例:
m = torchvision.models.resnet18(pretrained=True) ?# extract layer1 and layer3, giving as names `feat1` and feat2` new_m = torchvision.models._utils.IntermediateLayerGetter(m,{'layer1': 'feat1', 'layer3': 'feat2'}) out = new_m(torch.rand(1, 3, 224, 224)) print([(k, v.shape) for k, v in out.items()])
輸出結果:
[('feat1', torch.Size([1, 64, 56, 56])), ('feat2', torch.Size([1, 256, 14, 14]))]
【3】方法三:鉤子
class TestForHook(nn.Module): ? ? def __init__(self): ? ? ? ? super().__init__() ? ? ? ? self.linear_1 = nn.Linear(in_features=2, out_features=2) ? ? ? ? self.linear_2 = nn.Linear(in_features=2, out_features=1) ? ? ? ? self.relu = nn.ReLU() ? ? ? ? self.relu6 = nn.ReLU6() ? ? ? ? self.initialize() ? ? def forward(self, x): ? ? ? ? linear_1 = self.linear_1(x) ? ? ? ? linear_2 = self.linear_2(linear_1) ? ? ? ? relu = self.relu(linear_2) ? ? ? ? relu_6 = self.relu6(relu) ? ? ? ? layers_in = (x, linear_1, linear_2) ? ? ? ? layers_out = (linear_1, linear_2, relu) ? ? ? ? return relu_6, layers_in, layers_out features_in_hook = [] features_out_hook = [] def hook(module, fea_in, fea_out): ? ? features_in_hook.append(fea_in) ? ? features_out_hook.append(fea_out) ? ? return None net = TestForHook()
第一種寫法,按照類型勾,但如果有重復類型的layer比較復雜
net_chilren = net.children() for child in net_chilren: ? ? if not isinstance(child, nn.ReLU6): ? ? ? ? child.register_forward_hook(hook=hook)
推薦下面我改的這種寫法,因為我自己的網絡中,在Sequential
中有很多層,
這種方式可以直接先print(net)
一下,找出自己所需要那個layer
的名稱,按名稱勾出來
layer_name = 'relu_6' for (name, module) in net.named_modules(): ? ? if name == layer_name: ? ? ? ? module.register_forward_hook(hook=hook) print(features_in_hook) ?# 勾的是指定層的輸入 print(features_out_hook) ?# 勾的是指定層的輸出
原文鏈接:https://zhuanlan.zhihu.com/p/362985275
相關推薦
- 2023-08-15 vite打包報錯 Rollup failed to resolve
- 2024-03-06 CMake編譯Qt,生成簡單窗口
- 2022-03-22 Linux系統下gcc命令使用詳解_Linux
- 2022-07-18 Linux文件系統和日志分析
- 2022-07-01 react-router-dom?V6的配置使用實踐_React
- 2022-03-26 C語言goto語句簡單使用詳解_C 語言
- 2022-03-12 Android實現流光和光影移動效果代碼_Android
- 2023-03-26 Python中的“_args”和“__kwargs”用法詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支