您好,登錄后才能下訂單哦!
使用PyTorch求平方根報錯如何解決?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
初步使用PyTorch進行平方根計算,通過range()創建一個張量,然后對其求平方根。
a = torch.tensor(list(range(9))) b = torch.sqrt(a)
報出以下錯誤:
RuntimeError: sqrt_vml_cpu not implemented for 'Long'
Long類型的數據不支持log對數運算, 為什么Tensor是Long類型? 因為創建List數組時默認使用的是int, 所以從List轉成torch.Tensor后, 數據類型變成了Long。
print(a.dtype)
torch.int64
提前將數據類型指定為浮點型, 重新執行:
b = torch.sqrt(a.to(torch.double)) print(b)
tensor([0.0000, 1.0000, 1.4142, 1.7321, 2.0000, 2.2361, 2.4495, 2.6458, 2.8284], dtype=torch.float64)
補充:pytorch20 pytorch常見運算詳解
這個是矩陣(張量)每一個元素與標量進行操作。
import torch a = torch.tensor([1,2]) print(a+1) >>> tensor([2, 3])
這個就是兩個相同尺寸的張量相乘,然后對應元素的相乘就是這個哈達瑪積,也成為element wise。
a = torch.tensor([1,2]) b = torch.tensor([2,3]) print(a*b) print(torch.mul(a,b)) >>> tensor([2, 6]) >>> tensor([2, 6])
這個torch.mul()和*是等價的。
當然,除法也是類似的:
a = torch.tensor([1.,2.]) b = torch.tensor([2.,3.]) print(a/b) print(torch.div(a/b)) >>> tensor([0.5000, 0.6667]) >>> tensor([0.5000, 0.6667])
我們可以發現的torch.div()其實就是/, 類似的:torch.add就是+,torch.sub()就是-,不過符號的運算更簡單常用。
如果我們想實現線性代數中的矩陣相乘怎么辦呢?
這樣的操作有三個寫法:
torch.mm()
torch.matmul()
@,這個需要記憶,不然遇到這個可能會挺蒙蔽的
a = torch.tensor([[1.],[2.]]) b = torch.tensor([2.,3.]).view(1,2) print(torch.mm(a, b)) print(torch.matmul(a, b)) print(a @ b)
這是對二維矩陣而言的,假如參與運算的是一個多維張量,那么只有torch.matmul()可以使用。等等,多維張量怎么進行矩陣的乘法?在多維張量中,參與矩陣運算的其實只有后兩個維度,前面的維度其實就像是索引一樣,舉個例子:
a = torch.rand((1,2,64,32)) b = torch.rand((1,2,32,64)) print(torch.matmul(a, b).shape) >>> torch.Size([1, 2, 64, 64])
a = torch.rand((3,2,64,32)) b = torch.rand((1,2,32,64)) print(torch.matmul(a, b).shape) >>> torch.Size([3, 2, 64, 64])
這樣也是可以相乘的,因為這里涉及一個自動傳播Broadcasting機制,這個在后面會講,這里就知道,如果這種情況下,會把b的第一維度復制3次 ,然后變成和a一樣的尺寸,進行矩陣相乘。
print('冪運算') a = torch.tensor([1.,2.]) b = torch.tensor([2.,3.]) c1 = a ** b c2 = torch.pow(a, b) print(c1,c2) >>> tensor([1., 8.]) tensor([1., 8.])
和上面一樣,不多說了。開方運算可以用torch.sqrt(),當然也可以用a**(0.5)。
在上學的時候,我們知道ln是以e為底的,但是在pytorch中,并不是這樣。
pytorch中log是以e自然數為底數的,然后log2和log10才是以2和10為底數的運算。
import numpy as np print('對數運算') a = torch.tensor([2,10,np.e]) print(torch.log(a)) print(torch.log2(a)) print(torch.log10(a)) >>> tensor([0.6931, 2.3026, 1.0000]) >>> tensor([1.0000, 3.3219, 1.4427]) >>> tensor([0.3010, 1.0000, 0.4343])
.ceil() 向上取整
.floor()向下取整
.trunc()取整數
.frac()取小數
.round()四舍五入
.ceil() 向上取整.floor()向下取整.trunc()取整數.frac()取小數.round()四舍五入
a = torch.tensor(1.2345) print(a.ceil()) >>>tensor(2.) print(a.floor()) >>> tensor(1.) print(a.trunc()) >>> tensor(1.) print(a.frac()) >>> tensor(0.2345) print(a.round()) >>> tensor(1.)
這個是讓一個數,限制在你自己設置的一個范圍內[min,max],小于min的話就被設置為min,大于max的話就被設置為max。這個操作在一些對抗生成網絡中,好像是WGAN-GP,通過強行限制模型的參數的值。
a = torch.rand(5) print(a) print(a.clamp(0.3,0.7))
1.PyTorch是相當簡潔且高效快速的框架;2.設計追求最少的封裝;3.設計符合人類思維,它讓用戶盡可能地專注于實現自己的想法;4.與google的Tensorflow類似,FAIR的支持足以確保PyTorch獲得持續的開發更新;5.PyTorch作者親自維護的論壇 供用戶交流和求教問題6.入門簡單
關于使用PyTorch求平方根報錯如何解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。