PyTorch平方根報錯的處理方案

2022-10-04 12:48:15 字數 3346 閱讀 5658

初步使用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], dtyp程式設計客棧e=torch.float64)

補充:pytorch10 pytorch常見運算詳解

這個是矩陣(張量)每乙個元素與標量進行操作。

impor 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 = www.cppcns.comtorch.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.m程式設計客棧m()

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))

本文標題: pytorch平方根報錯的處理方案

本文位址:

平方根問題

考慮定義在兩正整數上的函式ssr 平方根之和的平方 ssr a,b sqrt a sqrt b 2。牛牛對函式值為整數的情況很感興趣。現在給定整數n和m,請幫助牛牛計算有序對 a,b 的數量,滿足1 a n,1 b m而且ssr a,b 是乙個整數。這道題本質上是要求sqrt ab 是整數,也就是要...

LintCode x的平方根

x的平方根 實現 int sqrt int n 函式,計算並返回 n 的平方根。樣例 sqrt 3 1 sqrt 4 2 sqrt 5 2 sqrt 10 3 挑戰 o log x solution 如果使用蠻力法來求解的話,肯定是會超時的。因此,我們需要使用牛頓迭代法來求解這問題 牛頓迭代法 對於...

x的平方根

題目三十九 實現int sqrt int x 函式,計算並返回 x 的平方根。您在真實的面試中是否遇到過這個題?yes 樣例sqrt 3 1 sqrt 4 2 sqrt 5 2 sqrt 10 3 挑戰 o log x class solution if i ix return i if i i x...