create_feature_extractor¶
- torchvision.models.feature_extraction.create_feature_extractor(model: Module, return_nodes: Optional[Union[list[str], dict[str, str]]] = None, train_return_nodes: Optional[Union[list[str], dict[str, str]]] = None, eval_return_nodes: Optional[Union[list[str], dict[str, str]]] = None, tracer_kwargs: Optional[dict[str, Any]] = None, suppress_diff_warning: bool = False, concrete_args: Optional[dict[str, Any]] = None) GraphModule [源码]¶
创建一个新的图模块,该模块从给定的模型中返回中间节点,并以用户指定的字符串作为键,请求的输出作为值的字典。这是通过 FX 重写模型的计算图来实现的,以将所需的节点作为输出返回。所有未使用的节点及其对应的参数都将被移除。
期望的输出节点必须指定为从顶级模块向下遍历模块层次结构到达叶操作或叶模块的“.”分隔路径。有关此处使用的节点命名约定的更多详细信息,请参阅 相关小节 和 文档。
并非所有模型都可以通过 FX 进行跟踪,尽管通过一些调整可以使它们协同工作。这是一个(不详尽的)提示列表:
如果您不需要跟踪特定的、有问题的子模块,可以通过将
leaf_modules
列表作为tracer_kwargs
的一个参数来将其变成“叶模块”(参见下面的示例)。它不会被跟踪,而是生成的图将持有对该模块的 forward 方法的引用。同样,您可以将函数变成叶函数,方法是将
autowrap_functions
列表作为tracer_kwargs
的一个参数(参见下面的示例)。某些内置的 Python 函数可能会有问题。例如,
int
在跟踪时会引发错误。您可以将它们包装在自己的函数中,然后将其作为autowrap_functions
的一个参数传递给tracer_kwargs
。
有关 FX 的更多信息,请参阅 torch.fx 文档。
- 参数:
model (nn.Module) – 将要从中提取特征的模型
return_nodes (list 或 dict, 可选) – 一个
List
或Dict
,其中包含将返回其激活的节点名称(或部分名称 - 请参阅上面的注释)。如果它是Dict
,则键是节点名称,值是图模块返回字典的用户指定键。如果它是List
,则它被视为直接将节点规范字符串映射到输出名称的Dict
。在指定了train_return_nodes
和eval_return_nodes
的情况下,不应指定此参数。train_return_nodes (list 或 dict, 可选) – 类似于
return_nodes
。如果训练模式的返回节点与评估模式的返回节点不同,则可以使用此参数。如果指定了此参数,则必须同时指定eval_return_nodes
,并且不应指定return_nodes
。eval_return_nodes (list 或 dict, 可选) – 类似于
return_nodes
。如果训练模式的返回节点与评估模式的返回节点不同,则可以使用此参数。如果指定了此参数,则必须同时指定train_return_nodes
,并且不应指定 return_nodes。tracer_kwargs (dict, 可选) – 用于
NodePathTracer
的关键字参数字典(它会将它们传递给父类 torch.fx.Tracer)。默认情况下,它将被设置为包装并使所有 torchvision 操作成为叶节点:{“autowrap_modules”: (math, torchvision.ops,),”leaf_modules”: _get_leaf_modules_for_ops(),} 警告:如果用户提供了 tracer_kwargs,则上述默认参数将附加到用户提供的字典中。suppress_diff_warning (bool, 可选) – 当训练和评估版本的图之间存在差异时,是否抑制警告。默认为 False。
concrete_args (Optional[Dict[str, any]]) – 不应被视为代理的具体参数。根据 Pytorch 文档,此参数的 API 可能不被保证。
示例
>>> # Feature extraction with resnet >>> model = torchvision.models.resnet18() >>> # extract layer1 and layer3, giving as names `feat1` and feat2` >>> model = create_feature_extractor( >>> model, {'layer1': 'feat1', 'layer3': 'feat2'}) >>> out = model(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]))] >>> # Specifying leaf modules and leaf functions >>> def leaf_function(x): >>> # This would raise a TypeError if traced through >>> return int(x) >>> >>> class LeafModule(torch.nn.Module): >>> def forward(self, x): >>> # This would raise a TypeError if traced through >>> int(x.shape[0]) >>> return torch.nn.functional.relu(x + 4) >>> >>> class MyModule(torch.nn.Module): >>> def __init__(self): >>> super().__init__() >>> self.conv = torch.nn.Conv2d(3, 1, 3) >>> self.leaf_module = LeafModule() >>> >>> def forward(self, x): >>> leaf_function(x.shape[0]) >>> x = self.conv(x) >>> return self.leaf_module(x) >>> >>> model = create_feature_extractor( >>> MyModule(), return_nodes=['leaf_module'], >>> tracer_kwargs={'leaf_modules': [LeafModule], >>> 'autowrap_functions': [leaf_function]})