본문 바로가기
AI Research/Deep Learning

[Pytorch-기초강의] 파이토치로 구현하는 ANN (텐서와 autograd)

by ga.0_0.ga 2023. 3. 1.
728x90
반응형

1. 텐서와 Autograd

텐서(Tensor)란?

파이토치에서 다양한 수식을 계산하는데 사용하는 기본적 자료구조, 숫자들의 특정한 모양으로 배열한 것

차원(랭크)이 0 : 숫자가 1개 ==> 스칼라(scalar)

차원(랭크)이 1 : 일렬로 숫자를 나열 ==> 벡터(vector)

차원(랭크)이 2 : 숫자를 가로, 세로로 나열 ==> 행렬(matrix)

차원(랭크)이 3이상: N차원 Tensor

예를 들어, 아래와 같이 3*3 텐서를 선언했다면,

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

size = [3, 3], shape = [3, 3], 랭크 = 2입니다.

 

또한 텐서의 랭크와 shape은 unsqueeze(), squeeze(), view() 함수를 사용해서 인위로 바꿀수도 있습니다. 이 함수들은 원소 개수는 유지하며 모양과 차원만 변경합니다.

unsqueeze(): 지정한 자리에 1이라는 차원 값을 추가해주는 함수입니다. 아래 코드는 0번째자리에 1이라는 차원 값이 추가됩니다.

x=torch.unsqueeze(x, 0)

 

squeeze(): 1이라는 차원 값을 제거해주는 함수입니다.

x=torch.squeeze(x)

 

view(): 지정한 모양으로 텐서를 변경합니다.

x = x.view(9)

▶ 텐서를 이용한 연산과 행렬곱

- A의 열 수와 B의 행 수는 같아야합니다.

- 행렬곱 A x B의 결과 행렬의 행 개수는 A와 같고, 열의 개수는 B와 같습니다.

▶Autograd

수식의 기울기를 자동으로 계산하는 것

경사하강법(gradient descent) : 오차를 수학 함수로 표현하여 미분한 뒤, 이 함수의 기울기를 구해 오차의 최솟값이 있는 방향을 찾아내는 알고리즘입니다.

=> 머신러닝에서의 오차란?

정답(ground truth) - 예측 값(prediction value) = 거리(distance)

학습 데이터에 대하여 이 거리들의 평균 = 오차(loss)

경사하강법

● Pytorch의 Autograd는 미분 계산을 자동화 하여 경사 하강법을 직접 구현하지 않고 사용가능합니다.

● 사용법 : 값이 1.0인 스칼라 텐서 w를 정의하고, w의 requires _grad를 True로 설정해주면, 파이토치의

Autograd 기능이 자동으로 계산할 때 w에 대한 미분값을 w.grad에 저장합니다.

w = torch.tensor(1.0, requires _grad=True)

 

 

2. 경사하강법으로 이미지 복원하기

▶정상적이지 않은 이미지로부터 원본 이미지를 복원해내는 코드입니다.

사용 코드 (전체 코드는 여기를 참고해주세요!)

 

GitHub - jgyy4775/3-min-pytorch: <펭귄브로의 3분 딥러닝, 파이토치맛> 예제 코드

<펭귄브로의 3분 딥러닝, 파이토치맛> 예제 코드. Contribute to jgyy4775/3-min-pytorch development by creating an account on GitHub.

github.com

 

- 필요한 라이브러리를 import 합니다.

import torch 
import pickle # 이미지 파일 로딩을 위한 라이브러리
import matplotlib.pyplot as plt # 이미지 출력을 위한 라이브러리

 

- 이미지를 import하여 시각화 합니다.

broken _image = torch.FloatTensor( pickle.load(open('./broken _
image _t.p', 'rb'),encoding='latin1' ) )
plt.imshow(broken _image.view(100,100))

 

- 무작위 텐서를 weird_function()함수에 입력해 얻은 가설 텐서와 오염된 이미지 사이의 오차를 구하는 함수입니다.

def distance _loss(hypothesis, broken _image):
    return torch.dist(hypothesis, broken _image)

 

- 경사하강법의 반복을 통해 실제 원본 이미지가 될 랜덤 이미지와  학습률 (learning rate)를 정의합니다. 

random_tensor = torch.randn(10000, dtype = torch.float)
lr = 0.8

학습률이란 학습을 얼마나 급하게 진행하는가를 정하는 값입니다.

학습률에 따른 학습 속도

 

- 일정 반복을 통해 학습을 진행하는 main 함수를 구현합니다.

for i in range(0,20000):
    random_tensor.requires_grad_(True) # 미분을 위해 requires_grad를 True로 설정
    hypothesis = weird_function(random_tensor)
    loss = distance_loss(hypothesis, broken_image) #  hypothesis와 broken_image 사이의 오차(loss)를 계산
    loss.backward() # backward함수로 loss 역전파

    # 직접 gradient descent를 구현하기 때문에 torch.no_grad 함수를 사용하여, 자동 기울기 계산을 비활성화
    with torch.no_grad():
        # loss가 최대값이 되는 방향의 반대 방향으로 이동
        random_tensor = random_tensor - lr*random_tensor.grad

    if i % 1000 == 0:
        print('Loss at {} = {}'.format(i, loss.item()))

plt.imshow(random_tensor.view(100,100).data)

- 복원된 이미지를 시각화한 모습입니다.

 

728x90
반응형

댓글