[英]Use only certain layers of pretrained torchvision network
我試圖在通過以下方式初始化的預先訓練的Torchvision Faster-RCNN網絡中僅使用某些層:
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()
這可行。 但是,將model.modules()
或model.children()
傳遞model.modules()
nn.Sequential
產生錯誤。 即使通過整個模型也會導致錯誤,例如
model = torch.nn.Sequential(*model.modules())
model.eval()
# x is a [C, H, W] image
y = model(x)
導致
AttributeError: 'dict' object has no attribute 'dim'
和
model = torch.nn.Sequential(*model.children())
model.eval()
# x is a [C, H, W] image
y = model(x)
導致
TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not tuple
這讓我感到困惑,因為過去我已經修改了其他PyTorch預訓練模型。 如何使用FasterRCNN預訓練模型創建僅使用某些層(例如,除最后一層以外的所有層)的新(預訓練)模型?
與其他簡單的CNN模型不同,將基於R-CNN的檢測器轉換為簡單的nn.Sequential
模型並nn.Sequential
。 如果查看R-CNN( 'generalized_rcnn.py'
)的功能,您會發現輸出功能(由FCN主干計算)不僅傳遞給RPN組件,而且還與輸入圖像甚至與目標(在培訓期間)。
因此,我想,如果您想改變R-CNN的運行方式,則必須使用基類torchvision.models.detection.FasterRCNN()
並為其提供不同的roi池參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.