# 输出模型中间特征
create_model时不止有可以控制head的参数,我们还可以添加参数features_only=True
可以输出模型的中间过程的特征图,方便我们做后续的分割或者其他任务而不仅仅局限于分类任务
但是不是所有模型都支持,比如ViT就没有 qvq,如果创建模型的时候加入此参数,会报错:features_only not implemented for Vision Transformer models.
不过没有也有办法,可以使用hook,这个我们下一节再讲
```
modelconvnext = timm.create_model('convnext_tiny', features_only=True, pretrained=True)
features = modelconvnext(img224)#len(features)#4
for i in features:
print(i.size())
'''
torch.Size([2, 96, 56, 56])
torch.Size([2, 192, 28, 28])
torch.Size([2, 384, 14, 14])
torch.Size([2, 768, 7, 7])
'''
```
其实不止有features_only=True,
还有out_indices-索引, output_stride-步幅 可以控制选择
可通过out_indices参数指定从哪个level获取feature
```
feature_extractor = timm.create_model('resnet50', features_only=True, out_indices=[1, 3, 4])
features = feature_extractor(img224)
for a in features:
print(a.shape)
# Results:
# torch.Size([1, 256, 56, 56])
# torch.Size([1, 1024, 14, 14])
# torch.Size([1, 2048, 7, 7])
```
如何实现的呢?
在build_model_with_cfg创建模型的时候,如果有feature相关的参数,就用FeatureListNet重新包装模型
接下来我们来看一下这些特征提取器究竟是什么类型东西
```
import timm
feature_extractor = timm.create_model('resnet34', features_only=True, out_indices=[3])
print('type:', type(feature_extractor))
print('len: ', len(feature_extractor))
for item in feature_extractor:
print(item)
```
输出:
type: <class 'timm.models.features.FeatureListNet'>
len: 7
conv1
bn1
act1
maxpool
layer1
layer2
layer3
可以看到,feature_extractor 其实也是一个神经网络,在 timm 中称为 FeatureListNet,而我们通过 out_indices 参数来指定截取到哪一层特征。