1 回答

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 張量中的行通常表示觀察結果。
添加回答
舉報