簡體   English   中英

使用 Pytorch 的 *list、.children() 和 nn.sequential 創建的模型產生不同的輸出張量

[英]Model Created With Pytorch's *list, .children(), and nn.sequential Produces Different Output Tensors

我目前正在嘗試在我的模型中使用預訓練的 DenseNet。 我正在關注本教程: https ://pytorch.org/hub/pytorch_vision_densenet/,它運行良好,輸入為 [1,3,244,244],它返回一個 [1,1000] 張量,完全符合預期。 但是,目前我正在使用此代碼將預訓練的 Densenet 加載到我的模型中,並將其用作“特征提取”模型。 這是init函數中的代碼

base_model = torch.hub.load('pytorch/vision:v0.10.0', 'densenet121', pretrained=True)

self.base_model = nn.Sequential(*list(base_model.children())[:-1])

它在轉發功能中是這樣使用的

x = self.base_model(x)

然而,采用相同的輸入,返回大小為 ([1, 1024, 7, 7]) 的張量。 我不知道什么不起作用,我認為這是因為 DenseNet 將所有層連接在一起,但我不知道如何讓它以相同的方法工作。 關於如何在我自己的模型中使用預訓練 DenseNet 的任何提示?

通常nn.Modules forward定義中具有邏輯,這意味着僅通過將模型轉換為順序塊將無法訪問它。 最值得注意的是,您通常會發現 CNN 和網絡的分類器層之間發生下采樣和/或扁平化。 這是 DenseNet。

如果你看一下Torchvision的正向實施DenseNet的在這里您將看到:

def forward(self, x: Tensor) -> Tensor:
    features = self.features(x)
    out = F.relu(features, inplace=True)
    out = F.adaptive_avg_pool2d(out, (1, 1))
    out = torch.flatten(out, 1)
    out = self.classifier(out)
    return out

您可以看到 CNN self.features輸出的張量(shape (*, 1024, 7, 7) )在被饋送到分類器(最后一層)之前如何通過 ReLU、自適應平均池和展平進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM