Python(Colab) 파이토치(Pytorch)

2023. 6. 18. 19:44파이썬/머신러닝 및 딥러닝

✔️ 파이토치(Pytorch)

- 텐서플로우와 함께 머신러닝, 딥러닝에서 가장 널리 사용되고 있는 프레임워크
- 초기에는 Torch라는 이름으로 Lua언어 기반으로 만들었다.
- 후에 파이썬 기반으로 변경한 것이 Pytorch이다.

1. 파이토치 사용하기

import torch

 

 

2. 파이토치 버전 확인하기

print(torch.__version__)
 

 

 

✔️ 스칼라: 하나의 상수를 의미
var1 = torch.tensor([1])
var2 = torch.tensor([6.5])
 
print(var1)
print(type(var1))

 

# 두 스칼라의  연산
print(var1+ var2)
print(var1- var2)
print(var1* var2)
print(var1/ var2)

 

✔️ 백터:상수가 2개이상 나열 되어 있을 경우
vector1= torch.tensor([1,2,3])
vector2 = torch.tensor([10,20,30])

print(vector1)

 

#백터의 연산
print(vector1+vector2)
print(vector1-vector2)
print(vector1*vector2)
print(vector1/vector2)

 

✔️행렬(Matrix): 2개 이상의 백터 값을 가지고 만들어진 것으로 행과 열의 개념을 가진 숫자의 나열
matrix1 = torch.tensor([[1,2],[3,4]])
matrix2 = torch.tensor([[7,8],[9,10]])
 
matrix1

 

#행렬의 연산
print(matrix1 + matrix2)
print(matrix1 - matrix2)
print(matrix1 * matrix2)
print(matrix1 / matrix2)
 

 

✔️ 탠서(tensor): 여러개의 행렬이 모이면 텐서라고 부른다.
- 배열이나 행렬과 매우 유사한 자료구조이다.
- 파이토치는 텐서를 사용하여 모델의 입/출력과 모델의 매개변수들을 처리하는데 사용된다.

출처: https://miro.medium.com/max/875/1*jRyyMAhS_NZxqyv3EoLCvg.png

tensor1 = torch.tensor([[[1,2],[3,4]],[[5,6],[7,8]]])
tensor2 = torch.tensor([[[9,10],[11,12]], [[13,14],[15,16]]])
tensor1
 
 
 
# 텐서의 4칙 연산
print(tensor1 + tensor2)
print(tensor1 - tensor2)
print(tensor1 * tensor2)
print(tensor1 / tensor2)
 

 

numpy array를 tensor로 변환

 

data = [[1,2],[3,4]]
 
np_array = np.array(data)
print(data)

x_np_1 = torch.tensor(np_array)
print(x_np_1)
 

 

메소드 및 함수

1) as_tensor(): 매개변수와 동일한 메모리 주소를 가리키는 뷰를 만드는 함수 (원래 메모리를 상속)

2) from_numpy(): 매개변수와 동일한 메모리 주소를 가리키는 뷰를 만드는 함수 (원래 메모리를 상속)

# as_tensor() : 매개변수와 동일한 메모리 주소를 가르키는 뷰를 만드는 함수

x_np_2 = torch.as_tensor(np_array)
print(x_np_2)
print('===========변경 후============')

x_np_2[0,0] = 200               #텐서의 값을 변경
print(x_np_2)
print(np_array)                 #원본 데이터도 영향을 끼침


print('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')

# from_numpy(): 매개변수와 동일한 메모리 주소를 가르키는 뷰를 만드는 함수
x_np_3 = torch.from_numpy(np_array)
print(x_np_3)


print('============변경 후 =============')
x_np_3[0,0] =  300  #기존 메모리 주소의 ndarray값을 변경하게 된다.

print(x_np_3)
print(np_array)
 

 

3) ones(a,b): a행 b열을 가지고 value가 1인 텐서를 만든다.

4) zeros(a,b): a행 b열을 가지고 value가 0인 텐서를 만든다.

5) full((a,b),c): a행 b열을 가지고 value가 c인 텐서를 만든다.

6) empty(a,b): a행 b열을 가지고 value가 랜덤인 텐서를 만든다.

7) eye(a): a행 a열 정사각형 텐서를 만든다.(대각선으로 값이 1이다)

8) arange(a): 0부터 a-1까지 배열을 탠서로 만든다.

9) rand(a,b): a행 b열 value가 0~1사이 랜덤한 값을 가진 텐서를 만든다.

10) rand(a,b): a행 b열 value가 -1~1사이 랜덤한 값을 가진 텐서를 만든다.

 

#ones(a행,b열) : a행 b열을 가지고 value가 1 인  텐서를 만든다.
a = torch.ones(2,3)
print(a)

#zeros(a행,b열) : a행 b열을 가지고 value가 0 인  텐서를 만든다.
b = torch.zeros(3,4)
print(b)

#full((a행,b열),value값) : a행,b열을 가지고 value가 10인 텐서를 만든다.
c= torch.full((2,3),10)
print(c)

#empty(a,b): a행 b열 무작위 값인 텐서
d=torch.empty(2,3)
print(d)


#eye(a): a행 a열 정사각형 텐서를 만들어주는데 대각선이 1임
e=torch.eye(5)
print(e)

# arange(a): 0부터 a-1까지 배열을 텐서로 만듬
f=torch.arange(10)
print(f)

# rand(a,b): a x b value가 0~1사이 랜덤한 값을 가진 텐서를 만듬
g=torch.rand(2,2)
print(g)

# randn(a,b): a x b value가 -1 ~ 1사이 랜덤한 값을 가진 텐서를 만듬
h=torch.randn(2,3)
print(h)
 

 

11) reshape()와 transpose()와 permute()

View의 규칙 

 

i = torch.arange(16).reshape(2,2,4)
print(i,i.shape)
print(i.dim()) #차원 확인
            #   2, 4를 가져옴

j = i.transpose(0,2)  # 2,4,2
print(j, j.shape)
 
k = i.permute((2,0,1)) # 2,2,4 - > 4,2,2 차원을 변경
print(k)
print(k.shape)
 
 

 

i는 torch.arange(16)으로 0 ~ 15를 차례대로 value로 같은 텐서를 만든다.
reshape(2,2,4)로 3차원으로 만드는데 0차원이 2개이고 2행 4열짜리 텐서를 만든다.

transpose(1,2)로 (2,2,4)에서 인덱스로 봤을 때 인덱스[1]인 2와 인덱스[2]인 4를 바꾼 텐서를 만드는 것 

4행 2열짜리 2차원 텐서를 만든다고 생각한다. 아닌가..

permute()도 역시 (2,0,1)을 각각 바꿔주는 역할을 하는 듯하다.

https://sanghyu.tistory.com/3

 

[PyTorch] view, reshape, transpose, permute함수의 차이와 contiguous의 의미

(본 포스팅은 이 글 번역 + 마지막에 제 생각을 덧붙였습니다.) PyTorch는 tensor의 type(형)변환을 위한 다양한 방법들을 제공하고 있다. 몇몇의 방법들은 초심자들에게 헷갈릴 수 있다. 그래서 view() v

sanghyu.tistory.com

비전공자인 내가 보기 좀 편한 설명

 

사칙연산

print(torch.add(tensor1, tensor2))
print(torch.subtract(tensor1, tensor2))
print(torch.multiply(tensor1, tensor2))
print(torch.divide(tensor1, tensor2))
print(torch.matmul(tensor1, tensor2))
numpy.matmul 함수는 두 어레이의 행렬곱 (matrix product)을 계산합니다.

 

인플레이스 사칙연산

인플레이스 연산 (모든 사칙 연산자에 _ 붙이면 인플레이스 연산이 된다!)
print(tensor1.add_(tensor2))
print(tensor1)

 

GPU사용하기

✔️torch.cuda.is_available()

파이토치에서 cuda를 사용할 수 있는지 여부를 확인하는 함수 (True/False)를 반환

✔️CUDA ?
엔비디아에서 개발한 병렬 컴퓨팅 플랫폼 
그래픽 처리 장치(GPU)를 사용하여 수치 연산을 가속화하는데 사용
모델 학습 및  추론 속도를 향상 시킬 수 있다.
tensor = torch.rand(3,4)
print(f'shape:{tensor.shape}')
print(f'shape:{tensor.dtype}')
print(f'shape:{tensor.device}')  # 연산되는 곳
 

 

tensor = tensor.reshape(4,3)
tensor = tensor.int()
 
if torch.cuda.is_available():
    print('GPU를 사용할 수 있음')
    tensor = tensor.to('cuda')
 
print(f'shape:{tensor.shape}')
print(f'shape:{tensor.dtype}')
print(f'shape:{tensor.device}')
 
해석:
1. tensor라는 변수에 0~1사이 값을 랜덤으로 가지는 3행 4열짜리 텐서를 만든다.
2. 텐서의 형태, 타입, 연산이 되는곳을 찍어본다.
3. tensor를 4행 3열로 바꾸고 정수타입으로 바꾼다.
4. if문을 통해 GPU사용 여부를 확인한다.
5. if가 True일 경우 : console에 GPU를 사용할 수 있음이라는 메세지를 보내고 tensor를 cuda로 이동시킨다
6. 그 후 텐서의 형태, 타입, 연산이되는곳을 찍어본다.

 

인덱싱과 슬라이싱

 

a = torch.arange(1,13).reshape(3,4)
print(a)
print(a[1])
print(a[0,-1])
print(a[1:,-1])
print(a[:2,2:])
728x90