numpy와torch 데이터 형식 전환 문제 해결
numpy 데이터 형식 전환
numpy는 astype로 데이터 형식을 변환하고float는 기본적으로 64비트로 변환되며 np를 사용할 수 있습니다.float32 32비트로 지정
#numpy float
a= np.array([1,2,3])
a = a.astype(np.float)
print(a)
print(a.dtype)
[1. 2. 3.]float64
a.dtype을 사용하여 데이터 형식을 지정하지 마십시오. 데이터를 잃어버릴 수 있습니다
#numpy float
b= np.array([1,2,3])
b.dtype= np.float32
print(b)
print(b.dtype)
[1.e-45 3.e-45 4.e-45]float32
np대신 플로트를 사용하지 마세요.float, 그렇지 않으면 예상치 못한 오류가 발생할 수 있습니다
np에서float64비트 전환 np.float32, 오류 발생
np.float64와 np.float32 곱하기, 결과는 np.float64
실제 사용 과정 중 np로 지정할 수 있습니다.float, np와 같은 구체적인 위치를 지정할 수도 있습니다.float, 하지만 np를 직접 지정합니다.플로트가 더 편해요.
torch 데이터 형식 전환
torch는 torch를 사용합니다.float () 변환 데이터 형식, float 기본값은 32비트, torch에는 torch가 없습니다.float64 () 이 방법
# torch float
b = torch.tensor([4,5,6])
b = b.float()
b.dtype
torch.float32
np.float64는 torch를 사용합니다.from_numpy가 torch로 바뀌어도 64비트예요.
print(a.dtype)
c = torch.from_numpy(a)
c.dtype
float64torch.float64
토치 대신 플로트를 쓰지 마세요.float, 그렇지 않으면 예상치 못한 오류가 발생할 수 있습니다
torch.float32와 torch.float64 데이터 형식을 곱하면 오류가 발생할 수 있으므로 곱할 때 데이터float의 구체적인 형식을 지정하거나 전환하는 것을 주의하십시오
np는 torch 데이터 유형의 대체 원리와 같이 서로 곱할 때만 torch.float 불일치 곱할 수 없음,np.float가 일치하지 않으면 곱할 수 있고 np로 바뀔 수 있습니다.float64
numpy와tensor 상호 회전
tensor가numpy로 전환
import torch
b = torch.tensor([4.0,6])
# b = b.float()
print(b.dtype)
c = b.numpy()
print(c.dtype)
torch.int64int64
numpy가tensor로 전환
import torch
import numpy as np
b= np.array([1,2,3])
# b = b.astype(np.float)
print(b.dtype)
c = torch.from_numpy(b)
print(c.dtype)
int32torch.int32
보시다시피 torch 기본 int형은 64비트이고numpy 기본 int형은 32비트입니다.
토치from_numpy VS torch.Tensor
최근에 데이터셋을 만들 때, 그림을 입력하여tensor를 돌릴 때, 나는torch를 사용할 수 있다는 것을 갑자기 발견하였다.Tensor는 직접적으로 numpy류를tensor류로 강제 변환하고torch도 사용할 수 있습니다.from_numpy 이 방법은numpy 클래스를tensor 클래스로 변환합니다. 그럼,torch.텐서와 토치.from_numpy 이 두 가지는 도대체 어떤 차이가 있을까요?이왕 토치.Tensor가 해낼 수 있어, 그 torch.from_numpy가 있으면 쓸데없는 거 아니에요?
답안
차이가 있습니다. torch를 사용합니다.from_numpy가 더 안전하고tensor를 사용합니다.Tensor는 비float 유형에서 예상과 일치하지 않습니다.
설명하다
실제로 양자의 차이는 매우 크다.불완전한 예를 들면, torch.Tensor는 c의 int, torch와 같다.from_numpy 마치 c++의 static_cast, 우리는 int64를 int32로 강제로 돌리면 높은 위치에서 낮은 위치로 돌리면 반드시 높은 위치가 지워지는 위험이 발생할 수 있다는 것을 알고 있다. 정밀도를 잃을 뿐만 아니라 심지어 음과 음으로 대조할 수도 있다.
여기 토치.텐서와 토치.from_numpy에도 같은 문제가 존재할 수 있다.
토치 좀 봐.Tensor의 문서에 명확하게 설명되어 있습니다.
torch.Tensor is an alias for the default tensor type (torch.FloatTensor).
토치.from_numpy의 문서는 설명입니다.
The returned tensor and ndarray share the same memory. Modifications to the tensor will be reflected in the ndarray and vice versa. The returned tensor is not resizable.
즉,
1. 변환된 원본은float 형식,torch입니다.텐서와 토치.from_numpy는 메모리를 공유합니다!그리고 변환된 결과의 유형은torch입니다.float32
2. 변환된 원본이float 형식이 아니라면torch.텐서가 얻은 건 토치야.float32, 그리고 torch.from_numpy는 원본 형식과 일치합니다!
신기하죠? 다음은 간단한 예입니다.
import torch
import numpy as nps1 = np.arange(10, dtype=np.float32)
s2 = np.arange(10) # dtype int64#
o11 = torch.Tensor(s1)
o12 = torch.from_numpy(s1)
o11.dtype # torch.float32
o12.dtype # torch.float32
#
o11[0] = 12
o12[0] # tensor(12.)#
o21 = torch.Tensor(s2)
o22 = torch.from_numpy(s2)
o21.dtype # torch.float32
o22.dtype # torch.int64
#
o21[0] = 12
o22[0] # tensor(0)
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
chainer의 connection을 괴롭히고 새로운 층을 만든다 (1)GPU GTX1070 우분투 14.04 chainer 1.14.0 chainer에서 최신 모델을 구현할 때는 links/connection이나 functions/connection을 괴롭힐 필요가 있다. 그래서 가장...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.