簡體   English   中英

關於用 PyTorch 編程 cnn 的問題

[英]Questions about programming a cnn with PyTorch

我對 cnn 編程很陌生,所以我有點迷茫。 我正在嘗試執行這部分代碼,他們要求我實現一個完全連接的網絡來對數字進行分類。 它應該包含 1 個具有 20 個單元的隱藏層。 我應該在隱藏層上使用 ReLU 激活 function。

class Network(nn.Module):
    def __init__(self):
        super(Network, self).__init__()
        self.fc1 = ... 
        
        self.fc2 = nn.Sequential(
            nn.Linear(500,10),
            nn.Softmax(dim = 1)
            )
        
    def forward(self, x):
        x = x.view(x.size(0),-1)
        x = self.fc1(x)
        x = self.fc2(x)
        return x

點是要填充的部分,我想到了這一行:

self.fc1 = nn.Linear(20, 500)

但我不知道它是否正確。 有人可以幫我嗎? 而且我完全不明白 function Softmax 做了什么......所以如果有人知道,請。 太感謝了!!

鈀。 這是加載數據的代碼:

batch_size = 64
trainset = datasets.MNIST('./data', train=True, download=True, transform=transforms.ToTensor())
train_loader = DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=1)
testset = datasets.MNIST('./data', train=False, download=True, transform=transforms.ToTensor())
test_loader = DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=1)

從為 model 給出的代碼可以看出,隱藏層有 500 個單元。 所以我假設你的意思是輸入 20 個單位。 有了這個假設,代碼必須是:

self.fc1 = nn.Sequential(
    nn.Linear(20, 500),
    nn.ReLU()
    )

來到問題的下一部分,假設您正在使用 MNIST 數據集並且您擁有 softmax function,我假設您正在嘗試預測圖像中存在的數字。 您的神經網絡在每一層執行各種乘法和加法運算,最后在 output 層中得到 10 個數字。 現在,您必須了解這 10 個數字來決定圖像中給出的 10 個數字中的哪一個。

一種方法是 select 具有最大值的單位。 例如,如果第 10 個單元在所有單元中具有最大值,那么我們可以斷定該數字是“9”。 如果第 2 個單位具有最大值,則我們得出結論該數字為“1”。

這很好,但更好的方法是將每個單元的值轉換為相應數字包含在圖像中的概率,然后我們選擇具有最高概率的數字。 這具有一定的數學優勢,有助於我們定義更好的損失 function。

Softmax 幫助我們將值轉換為概率。 在應用 softmax 時,所有值都在 (0, 1) 范圍內,它們的總和為 1。

如果您對深度學習及其背后的數學感興趣,我建議您查看 Andrew NG 的深度學習課程。

您沒有提到數據的形狀,所以我將假設datasets.MNIST返回的預期形狀。

數據形狀: torch.Size([64, 1, 28, 28])

class Network(nn.Module):
    def __init__(self):
        super(Network, self).__init__()
        self.fc1 = nn.Sequential(
            nn.Linear(1*28*28, 20),
            nn.ReLU())
        
        self.fc2 = nn.Sequential(
            nn.Linear(500,10),
            nn.Softmax(dim = 1))
        
    def forward(self, x):
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        x = self.fc2(x)
        return x

nn.Linear的第一個參數是輸入特征的大小,第二個參數是單元數

對於self.fc1 ,輸入特征的大小是數據形狀的乘積,批量大小除外,即1 * 28 * 28 根據您的帖子,第二個參數應該是20 (20 個單位)。

self.fc1 (也是 self.fc2 的輸入)中self.fc2的形狀將是(batch size, 20)

對於self.fc2 ,輸入特征的大小將為20 ,而單位數(也是位數)將為10

暫無
暫無

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

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