PyTorch 제곱 근 오류 처리 방안

4599 단어 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)
보충:pytorch 10 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)

이것 은 2 차원 행렬 에 있어 서 연산 에 참여 하 는 것 이 다 차원 장 량 이 라면 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 의 1 차원 을 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 자연 수 를 기본 으로 한 다음 에 log 2 와 log 10 이 야 말로 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()소수 추출
반올림
.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))

이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기