亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 PyTorch 中使用 numpy 函數作為損失函數并避免在運行時出錯?

如何在 PyTorch 中使用 numpy 函數作為損失函數并避免在運行時出錯?

郎朗坤 2021-10-10 13:58:31
對于我的任務,我不需要計算梯度。我只是在損失評估nn.L1Loss中用 numpy 函數 ( corrcoef)替換,但出現以下錯誤:RuntimeError: Can’t call numpy() on Variable that requires grad. Use var.detach().numpy() instead.我不知道我應該如何分離圖表(我試過torch.Tensor.detach(np.corrcoef(x, y)),但我仍然遇到同樣的錯誤。我最終使用torch.no_grad以下方法包裝了所有內容:with torch.no_grad():    predFeats = self.forward(x)    targetFeats = self.forward(target)    loss = torch.from_numpy(np.corrcoef(predFeats.cpu().numpy().astype(np.float32), targetFeats.cpu().numpy().astype(np.float32))[1][1])但是這次我收到以下錯誤:TypeError: expected np.ndarray (got numpy.float64)我想知道,我做錯了什么?
查看完整描述

1 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

with torch.no_grad():

    predFeats = self(x)

    targetFeats = self(target)

    loss = torch.tensor(np.corrcoef(predFeats.cpu().numpy(),

                                    targetFeats.cpu().numpy())[1][1]).float()

您可以RuntimeError通過從計算圖中分離張量 (predFeats和targetFeats) 來避免第一個。即獲取沒有梯度和梯度函數 ( grad_fn)的張量數據的副本。


所以,而不是


torch.Tensor.detach(np.corrcoef(x.numpy(), y.numpy())) # Detaches a newly created tensor!

# x and y still may have gradients. Hence the first error.

什么都不做,做


# Detaches x and y properly

torch.Tensor(np.corrcoef(x.detach().numpy(), y.detach().numpy()))

但是,讓我們不要打擾所有的支隊。


就像您正確修復一樣,讓我們禁用漸變。


torch.no_grad()

現在,計算特征。


predFeats = self(x) # No need for the explicit .forward() call

targetFeats = self(target)

我發現打破你的最后一條線很有幫助。


loss = np.corrcoef(predFeats.numpy(), targetFeats.numpy()) # We don't need to detach


# Notice that we don't need to cast the arguments to fp32

# since the `corrcoef` casts them to fp64 anyway.


print(loss.shape, loss.dtype) # A 2-dimensional fp64 matrix


loss = loss[1][1]

print(type(loss)) # Output: numpy.float64

# Loss now just a simple fp64 number

這就是問題所在!


因為,當我們做


loss = torch.from_numpy(loss)

我們傳入一個數字 ( numpy.float64) 而它需要一個 numpy 張量 ( np.ndarray)。


如果您使用的是 PyTorch 0.4 或更高版本,則內置了對標量的支持。


只需將from_numpy()方法替換為通用tensor()創建方法即可。


loss = torch.tensor(loss)

PS 您可能還想查看設置rowvar=False,corrcoef因為 PyTorch 張量中的行通常表示觀察結果。


查看完整回答
反對 回復 2021-10-10
  • 1 回答
  • 0 關注
  • 833 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號