카테고리 없음

파이토치 자연어처리(3) - 텐서의 연산과 배열

SolartheNomad 2023. 2. 10. 16:26

1. 텐서끼리 더하기

add()메서드를 사용한다. 

import torch
x = torch.randn(2,3)
describe(x)
describe(torch.add(x,x))

 

 

 

2. 텐서의 특정차원에 적용할 수 있는 연산 

 

import torch
x = torch.arange(6)
describe(x)

# x는 6x1행렬로 만들어진 배열로 나옴 
x = x.view(2,3)
#view(2,3) : 행 두개, 열 세개의 텐서로 만들어서 x 안에 다시 넣음 
describe(x)

 

 

 

2.1 텐서의 각 행에서 각 열의 같은 인덱스끼리 더하는 연산 

sum(x, dim=0)

 

2.2 텐서의 각 행끼리 더하는 연산 

 

sum(x, dim=1)

 

2.3 전치행렬화 시키기 

 

torch.transpose(텐서 변수명, 숫자, 숫자)  : 

 

 

 

3. 인덱싱 

 

 

 

 

4. 텐서 연결 

import torch 
x = torch.arange(6).view(2,3)
describe(x)
describe(torch.cat([x,x],dim=0)

 

 

 

import torch
x = torch.arange(6).view(2,3)
describe(torch.cat([x,x],dim=1))

 

 

5. 선형대수 연산

 

선형대수 연산메서드

 

mm : 행렬곱셈

inverse, pinverse : 역행렬화

trace : 대각화 

 

 

6. 계산 그래프 

텐서의 requires_grad 불리언 매개변수를 True로 지정해야 함 

-> 그레디언트 기반 학습에 필요한 손실 함수 + 텐서의 그레디언트를 기록하는 부과함수 활성화

 

requires_grad = True 텐서의 그레디언트 계산 부가 정보 관리 방법

 

1. 파이토치가 정방향 계산 값을 기록한다. 

2. 스칼라값 하나를 사용해 역방향 계산 = backwrd() 메서드 사용하여 호출 

정방향 계산은 정방향 계산에 참여한 턴서 객체에 대한 그레디언트 값 계산 

 

 

** 그레디언트 

함수 입력에 대한 함수 출력의 기울기 

모델의 오류 신호에 대한 파라미터의 기여도 

 

import torch
x = torch.ones(2,2,requires_grad = True)
describe(x)
print(x.grad is None)

 

y = (x+2) + (x+5) +3
describe(y)
print(x.grad is None)

x = y.mean()
describe(z)
z.backward()
print(x.grad is None)

 

 

7. CUDA 텐서 만들기 

 

6번이전 까지는 텐서를 CPU 메모리에 할당 했다면, CUDA 텐서는 GPU 메모리에 할당할 수 있는 텐서이다. 

CUDA 텐서는 API를 사용하여 GPU 활용이 가능하다. 

CUDA API는 Nvidia에서 만들었고 Nvidia GPU에서만 사용된다. 

 

파이토치는 타입을 유지하면서 텐서를 CPU에서 GPU로 전송 가능

내부적인 할당 방식만 다를 뿐 CPU 첸서와 사용법이 같음 

 

torch.cuda.is_available() : GPU 사용이 가능한지 확인함 

torch.device() : 장치 이름 가져오기 

.to(device) : 향후 초기화되는(=만들어지는) 모든 텐서를 타깃 장치로 가져옴

 

import torch
print(torch.cuda_is_available())

True

#장치와 무관한 텐서를 만들어주기
#내 device에 담아주기 
device = torch.device("cuda" if torch.cuda.is_availabe() else "cpu")
print(device)

cuda

x = torch.rand(3.3).to(device)
descvibe(x)

 

cuda 텐서 사용법 

 

1. cuda 객체와 cuda 가 아닌 객체를 다루려면 두 객체가 같은 장치에 있는지 확인해야 함

-> 계산 그래프가 아닌 측정 지표를 계산할 때 오류가 발생할 수 있다. 

-> 두 텐서 객체로도 계산할 때도 마찬가지로 객체가 같은 장치에 있는 지 확인해야 한다. 

 

x = torch.rand(3,3)
x + y

# 두 객체가 모두 device에 있는지 확인해주고 계산하자 

 

cpu_device = torch.device("cpu")
y = y.to(cpu_device)
x = x.to(cpu.device) # x, y객체 cpu로 이동시켜주기 
x + y

 

 

** 다만, GPU로 데이터를 넣고 꺼내는 작업은 비용이 많이 들기 때문에 병렬 계산을 GPU에서 수행하고 최종 결과만 CPU로 전송하게 해야 한다. 이럴 떄 cuda 장치가 여러개(GPU가 여러개)라면 조금 더 효율적인 계산을 하는 것이 가능하기 ㅐㄷ문에, 다음 변수를 이용하여 계산 하는 것이 좋다. 

 

환경변수 설정