Pytorch 변수 형식 변환 실현

Pytorch 의 데이터 형식 은 다양한 Tensor 이 며,Tensor 는 고 차원 행렬 로 이해 할 수 있 습 니 다.
Numpy 의 Array 와 유사 합 니 다.Pytorch 의 tensor 는 CPU 에 있 는 데이터 형식 과 GPU 에 있 는 데이터 형식 을 포함 하 며,일반 GPU 에 있 는 Tensor 는 CPU 에 있 는 Tensor 에 cuda()함 수 를 추가 하여 얻 을 수 있 습 니 다.Type 함 수 를 사용 하면 변수 종 류 를 볼 수 있 습 니 다.
일반 시스템 은 기본적으로 torch.Float Tensor 형식 입 니 다.
예 를 들 어 data=torch.Tensor(2,3)는 2*3 의 장 량 이 고 유형 은 FloatTensor 이다.data.cuda()는 GPU 의 장 량 형식,torch.cuda.FloatTensor 형식 으로 변 환 됩 니 다.
다음은 Pytorch 에서 변수 간 의 상호 전환 을 간단하게 소개 합 니 다.
(1)CPU 또는 GPU 장 량 간 전환
일반적으로 Tensor 뒤에 long(),int(),double(),float(),byte()등 함 수 를 추가 하면 Tensor 를 유형 변환 할 수 있 습 니 다.
예 를 들 어 Torch.LongTensor--->Torch.FloatTensor 는 data.float()를 직접 사용 하면 된다.
type()함수 도 사용 할 수 있 습 니 다.data 는 Tensor 데이터 형식 이 고,data.type()은 data 를 보 여 주 는 형식 입 니 다.data.type(torch.Float Tensor)을 사용 하면 torch.Float Tensor 형식 장 량 으로 강제 변환 합 니 다.
왜 유형 을 바 꿔 야 하 는 지 모 르 겠 지만 a1,a2 두 장의 곱 을 구 해 야 합 니 다.a1.type 을 사용 할 수 있 습 니 다.as(a2)는 a1 을 a2 와 같은 유형 으로 변환 합 니 다.
(2)CPU 장 량--->GPU 장 량,data.cuda()사용
(3)GPU 장 량--->CPU 장 량 사용 data.cpu()
(4)Variable 변 수 를 일반적인 Tensor 로 변환 합 니 다.사실 Variable 을 Wrapper 로 이해 할 수 있 습 니 다.안에 있 는 data 는 Tensor 입 니 다.Var 가 Variable 변수 라면 Var.data 를 사용 하여 Tensor 변 수 를 얻 습 니 다.
(5)Tensor 와 Numpy Array 사이 의 전환
Tensor--->Numpy 는 data.numpy()를 사용 할 수 있 고 data 는 Tensor 변수 입 니 다.
Numpy--->Tensor torch.from 사용 가능numpy(data),data 는 numpy 변수 입 니 다.
보충:Numpy/pytorch 의 데이터 형식 과 강제 형식 변환
1.데이터 형식 소개
Numpy
NumPy 는 Python 보다 더 많은 종류의 수치 형식 을 지원 합 니 다.다음 표 는 NumPy 에서 정의 하 는 서로 다른 스칼라 데이터 형식 을 보 여 줍 니 다.
번호
데이터 형식 및 설명
1.
bool_바이트 로 저 장 된 불 값(진짜 또는 가짜)
2.
int_기본 정수,C 에 해당 하 는 long,보통 int 32 또는 int 64
3.
intc 는 C 에 해당 하 는 int 로 보통 int 32 또는 int 64 이다.
4.
intp 색인 에 사용 되 는 정수,C 에 해당 하 는 sizet,보통 int 32 또는 int 64
5.
int 8 바이트(-128~127)
6.
int 1616 비트 정수(-32768~32767)
7.
int 3232 비트 정수(-2147483648~21474833647)
8.
int 6464 비트 정수(-9223372036854775808~922337236854775807)
9.
uint 88 비트 부호 없 는 정수(0~255)
10.
uint 1616 비트 부호 없 는 정수(0~65535)
11.
uint 3232 비트 부호 없 는 정수(0~4294967295)
12.
uint 6464 비트 부호 없 는 정수(0~18446744073709551615)
13.
float_float 64 의 약자
14.
float 16 반 정밀도 부동 소수점:기호 위치,5 비트 지수,10 비트 꼬리 수
15.
float 32 단 정밀도 부동 소수점:기호 위치,8 비트 지수,23 비트 꼬리 수
16.
float 64 쌍 정밀도 부동 소수점:기호 위치,11 비트 지수,52 비트 꼬리 수
17.
complex_complex 128 의 약자
18.
complex 64 복수,두 개의 32 비트 부동 소수점 으로 표시(실 부 와 허 부)
19.
complex 128 복수,두 개의 64 비트 부동 소수점 으로 표시(실 부 와 허 부)
형식 명 을 직접 사용 하면 오류 가 발생 할 수 있 습 니 다.정확 한 사용 방식 은 np.호출,eg,np.uint 8 입 니 다.
Pytorch
Torch 는 7 가지 CPU 장 량 유형 과 8 가지 GPU 장 량 유형 을 정의 합 니 다.여기 서 우 리 는 CPU 에 있 는 것 만 설명 합 니 다.사실은 GPU 에 중간 에 cuda 만 추가 하면 됩 니 다.예 를 들 어 torch.cuda.Float Tensor:
torch.Float Tensor(2,3)2*3 Float 형식의 장 량 구축
torch.Double Tensor(2,3)2*3 Double 형식의 장 량 구축
torch.Bite Tensor(2,3)2*3 Byte 형식의 장 량 구축
torch.CharTensor(2,3)2*3 Char 형식의 장 량 구축
torch.Short Tensor(2,3)2*3 Short 형식의 장 량 구축
torch.Intensor(2,3)2*3 Int 형식의 장 량 구축
torch.LongTensor(2,3)2*3 Long 유형의 장 량 구축
마찬가지 로 형식 이름 을 직접 사용 하면 오류 가 발생 할 수 있 습 니 다.정확 한 사용 방식 은 torch.호출,eg,torch.Float Tensor()입 니 다.
2.Python type()함수
type 함 수 는 변수 에서 호출 되 거나 변 수 를 매개 변수 로 입력 할 수 있 습 니 다.
데이터 형식 이 아 닌 이 변수의 형식 을 되 돌려 줍 니 다.

data = np.random.randint(0, 255, 300)
print(type(data))
출력

3.Numpy/pytorch 의 dtype 속성
변수 로 되 돌아 오 는 데이터 형식

t_out = torch.Tensor(1,2,3)
print(t_out.dtype)
출력
torch.float32
t_out = torch.Tensor(1,2,3)
print(t_out.numpy().dtype)
출력
float32
4.Numpy 의 형식 변환
내 가 왜 이 함 수 를 썼 는 지 얘 기 좀 해 봐.
trochvision.transforms.ToPILImage()함 수 를 실행 하기 위해
그래서 저 는 numpy 의 ndarray 에서 PILImage 로 바 꾸 고 싶 어 요.
다음 과 같은 시 도 를 해 봤 습 니 다.

data = np.random.randint(0, 255, 300)
n_out = data.reshape(10,10,3)
print(n_out.dtype)
img = transforms.ToPILImage()(n_out)
img.show()
그러나 유감스럽게도 잘못 보 고 했 습 니 다.
raise TypeError('Input type {} is not supported'.format(npimg.dtype))
TypeError: Input type int32 is not supported
ndarray 를 PILImage 로 바 꾸 려 면 ndarray 가 uint 8 타 입 이 라 고 요구 하기 때 문 입 니 다.
그래서 나 는 패 배 를 인정 했다.
사용 하 다

n_out = np.linspace(0,255,300,dtype=np.uint8)
n_out = n_out.reshape(10,10,3)
print(n_out.dtype)
img = torchvision.transforms.ToPILImage()(n_out)
img.show()
출력 을 받다
uint8

응,그림 이 한 장 나 왔 어.
하지만 답답 해 요.원 하 는 난수 와 는 효과 가 달라 요.
그래서 저 는 astype 함 수 를 썼어 요.
astype()함수
변수 에서 호출 되 지만 원 변수의 데이터 형식 을 직접 호출 하지 않 습 니 다.반환 값 은 형식 을 바 꾼 후의 새로운 변수 이기 때문에 값 을 부여 해 야 합 니 다.

n_out = n_out.astype(np.uint8)

#        
np.random.seed(0)
 
data = np.random.randint(0, 255, 300)
print(data.dtype)
n_out = data.reshape(10,10,3)
 
#      
n_out = n_out.astype(np.uint8)
print(n_out.dtype)
 
img = transforms.ToPILImage()(n_out)
img.show()
출력
int32
uint8

5.Pytorch 의 형식 변환
pytorch 에 astype 함수 가 없습니다.정확 한 변환 방법 은?
Way 1:변수 직접 호출 형식

tensor = torch.Tensor(3, 5)
torch.long()은 tensor 를 long 형식 으로 투사 합 니 다.

newtensor = tensor.long()
torch.half()는 tensor 를 반 정밀도 부동 소수점 유형 으로 투사 한다.

newtensor = tensor.half()
torch.int()는 이 tensor 를 int 형식 으로 투사 합 니 다.

newtensor = tensor.int()
torch.double()은 이 tensor 를 double 형식 으로 투사 합 니 다.

newtensor = tensor.double()
torch.float()는 이 tensor 를 float 형식 으로 투사 합 니 다.

newtensor = tensor.float()
torch.char()는 이 tensor 를 char 형식 으로 투사 합 니 다.

newtensor = tensor.char()
torch.byte()는 이 tensor 를 byte 형식 으로 투사 합 니 다.

newtensor = tensor.byte()
torch.short()는 이 tensor 를 short 형식 으로 투사 합 니 다.

newtensor = tensor.short()
마찬가지 로 numpy 의 astype 함수 와 마찬가지 로 반환 값 이 야 말로 형식 을 바 꾼 결과 이 고 호출 된 변수 유형 은 변 하지 않 습 니 다.
Way 2:변 수 는 pytorch 의 type 함 수 를 호출 합 니 다.
type(new_type=None,async=False)new 를 제공 하지 않 으 면type,형식 을 되 돌려 줍 니 다.그렇지 않 으 면 이 대상 을 지정 한 형식 으로 변환 합 니 다.이미 정확 한 유형 이 라면 실행 하지 않 고 원래 대상 으로 돌아 갑 니 다.
용법 은 다음 과 같다.

self = torch.LongTensor(3, 5)
#        
print self.type(torch.FloatTensor)
Way 3:pytorch 의 type 변 수 를 호출 합 니 다.as 함수
만약 장 량 이 이미 정확 한 유형 이 라면 조작 을 실행 하지 않 을 것 이다.구체 적 인 조작 방법 은 다음 과 같다.

self = torch.Tensor(3, 5)
tesnor = torch.IntTensor(2,3)
print self.type_as(tesnor)
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기