簡體   English   中英

PyTorch nn.CrossEntropyLoss 運行時維度超出范圍錯誤

[英]PyTorch nn.CrossEntropyLoss runtime dimension out of range error

我目前正在使用 PyTorch 實現連續詞袋 (CBOW) model。 不過,在實現交叉熵損失時,我遇到了一些問題。 這是導致問題的代碼部分:

for idx, sample in enumerate(self.train_data):
    x = torch.tensor(sample[0], dtype=torch.long)
    y = np.zeros(shape=(self.vocab_size)) # self.vocab_size = 85,000
    y[int(sample[1])] = np.float64(1)
    y = torch.tensor(y, dtype=torch.long)

    if torch.cuda.is_available():
        x = x.cuda()
        y = y.cuda()

    optimizer.zero_grad()

    output = self.model(x) # output's shape is the same as self.vocab_size
    loss = criterion(output, y)
    loss.backward()
    optimizer.step()

為了簡要解釋我的代碼,我實現的model基本上輸出上下文數組的平均嵌入值,並執行線性投影以將它們投影成與詞匯表大小相同的形狀。 然后我們通過 softmax function 運行這個數組。

self.train_data的內容基本上是(context, target_word)對。 y是令牌的 one-hot 編碼數組。

我知道 nn.CrossEntropyLoss 的第二個輸入是nn.CrossEntropyLoss C = # of classes ,但我不確定我的代碼哪里出錯了。 詞匯量是 85,000,所以 class 的數量不是 85,000 嗎?

如果我將輸入更改為

loss = criterion(output, 85000)

我犯了同樣的錯誤:

*** RuntimeError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

我做錯了什么,我應該如何理解 PyTorch 的交叉熵損失的輸入?

謝謝。

我知道 nn.CrossEntropyLoss 的第二個輸入是 C = # of classes,但我不確定我的代碼哪里出錯了。 詞匯量是 85,000,所以 class 的數量不是 85,000 嗎?

類的數量(nc)可能是 85000,但你也有批量大小:

target = torch.randint (nc, (bs,))

目標代表真實值,而 output 是您從 model 獲得的特定輸入 x 在您的情況下output = self.model(x)

在這里

loss = criterion(output, target)

您可以說 output 是您目前從 model 獲得的,目標是您在完成訓練時應該獲得的。

暫無
暫無

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

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