머신러닝&딥러닝/이론

[머신러닝&딥러닝] 파이토치(PyTorch) 기초 요소

거북이07 2024. 1. 8. 17:01

파이토치(PyTorch)

파이토치(PyTorch)는 파이썬 기반의 오픈 소스 머신러닝 라이브러리로 페이스북 인공지능 연구집단에 의해 개발되었다. 간결하고 구현이 빠르며 텐서플로우보다 사용자가 익히기 훨씬 쉽다는 특징이 있다.

 

파이토치의 장점

  1. 설치가 간편하다
  2. 이해와 디버깅이 쉬운 직관적이고 간결한 코드로 구성되어있다.
  3. 다양한 모델 구축이 가능하다.
  4. 동적 계산 그래프

파이토치의 기초 요소

 

스칼라(Scalar)

스칼라(scalar)는 우리가 흔히 수학에서 부르는 상수값이라고 보면 된다.

 

💻 코드

var1 = torch.tensor([1])
print(var1) # 값 출력

 

✔결과

tensor([1])

벡터(Vector)

벡터(vector)는 수학 개념으로 크기와 방향을 갖는 물리량을 의미한다. 상수가 두개 이상 나열된 경우

 

💻 코드

vec1 = torch.tensor([1, 2, 3])
print(vec1)

 

✔결과

tensor([1, 2, 3])

 


행렬(Matrix)

행렬(Matrix)은 2개 이상의 백터 값을 가지고 만들어진 값으로, 행과 열의 개념을 가진 숫자의  나열이다.

 

💻 코드

mat1 = torch.tensor([[1,2], [3,4]])
print(mat1)

 

✔결과

tensor([[1, 2],
        [3, 4]])

 

텐서(Tensor)

텐서(Tensor)는 다수의 행렬이 모인것이다. 배열이나 행렬과 매우 유사한 특수 자료구조이며 파이토치는 텐서를 사용하여 모델의 입력과 출력,  모델의 매개변수들을 처리한다.

 

💻 코드

tensor1 = torch.tensor([[[1,2],[3,4]], [[5,6],[7,8]]])
print(tensor1)

 

✔결과

tensor([[[1, 2],
         [3, 4]],

        [[5, 6],
         [7, 8]]])

 

스칼라, 벡터, 행렬, 텐서는 기본 사칙연산(+, -, *, /)을 사용할 수 있다.
print(요소 + 요소) #tensor([11.5000])
print(요소 - 요소) #tensor([-9.5000])
print(요소 * 요소) #tensor([10.5000])
print(요소 / 요소) #tensor([0.0952])

 

.add_()

모든  사칙연산자에 _ 를붙이면 inplace가 된다.

 

💻 코드

print(tensor1.add_(tensor2)) # 인플레이스
print(tensor1)

텐서(Tensor)의 변환

data = [[1,2], [3, 4]]
print(data)
print(type(data))
[[1, 2], [3, 4]]
<class 'list'>

 

1. 리스트를 텐서로 변환

 torch.tensor() 함수를 사용.

 

💻 코드

x_data = torch.tensor(data)
print(x_data)
tensor([[1, 2],
        [3, 4]])

 

2. ndarray를 텐서로 변환

ndarray를  텐서로 변환하는 방법은 여러가지가 있다.

 

💻 코드

np_array = np.array(x_data) # ndarray변수 생성
np_array

# 방법1 torch.tensor() 함수를 이용하여 변경
x_np_1 = torch.tensor(np_array)
x_np_1

# 방법2 torch.as_tensor() 함수를 이용하여 변경
# 해당 함수는 여러가지 자료구조가 들어갈 수 있다.
# as_tensor()함수는 ndarray와 동일한 메모리 주소를 가리키는 뷰를 만든다.
x_np_2 = torch.as_tensor(np_array)
print(x_np_2) # [1,2], [3,4] 출력
x_np_2[0, 0] = 200 # x_np_2[0,0]에  200을 대입
print(x_np_2) # [0,0] 해당 위치에 값이 200으로 변경되어있음.
print(np_array) # 동일한 메모리 주로를 가리키기때문에 원본도 변형되어있음.

# 방법3 torch.from_numpy() 함수를 이용하여 변경
# ndarray만 들어가야한다.
# as_tensor과 마찬가지로 원본 자료도 변형된다.
x_np_3 = torch.from_numpy(np_array)
print(x_np_3)
x_np_3[0,0] = 300
print(x_np_3)
print(np_array)

 

2. 텐서를 ndarray로 변환

np_again = x_np_1.numpy()
print(np_again, type(np_again)) # [[100,2][3,4]] <class 'numpy.ndarray'>