파이토치 자연어처리(3) - 텐서의 연산과 배열
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가 여러개)라면 조금 더 효율적인 계산을 하는 것이 가능하기 ㅐㄷ문에, 다음 변수를 이용하여 계산 하는 것이 좋다.
환경변수 설정