[英]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.