본문 바로가기
딥러닝(파이토치)

3장. 파이토치로 구현하는 ANN 3.2절 경사하강법으로 이미지 복원하기

by MAKING CHA 2020. 12. 18.
반응형

>3분 딥러닝 파이토치<

3.1.3

머신러닝 모델은 입력된 데이터를 기반으로 학습한다. 충분한 데이터를 보지 못해 학습이 끝나지 않은 모델은 정답이 아닌 결과를 출력할 가능성이 크다. 

데이터에 대한 정답과 머신러닝 모델이 예측한 결과의 차이를 산술적으로 표현한 것을 거리

학습 데이터로 계산한 거리들의 평균을 오차

즉, 오차가 작은 머신러닝 모델일 수록 주어진 데이터에 대해 정확한 답을 낸다고 볼 수 있다.

오차를 최소화하는 데 가장 많이 쓰이는 알고리즘은 경사하강법이다. 

경사하강법이란 오차를 수학 함수로 표현한 후 미분하여 이 함수의 기울기를 구해 오차의 최솟값이 있는 방향을 찾아내는 알고리즘이다.

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

<복원을 위한 사고 과정>

1. 오염된 이미지(broken_image)와 크기가 같은 랜덤 텐서(random_tensor)를 생성

2.랜덤 텐서를 weird_function() 함수에 입력해 똑같이 오염된 이미지를 가설(hypothesis)이라고 부름

     *원본 이미지가 weird_funtion()함수에 입력되어 오염된 이미지를 출력했다.

     *인위적으로 생성한 무작위 이미지가 weird_function() 함수에 입력되어 가설을 출력했다.

3.가설과 오염된 이미지가 같다면 무작위 이미지와 원본 이미지도 같을 것이다.

4.그러므로 weird_function(random_tensor) = broken_image 관계가 성립하도록 만든다.

1.파이토치 임포트,오염된 이미지와 복원된 이미지를 출력하는데 필요한 맷플로립 라이브러리 임포트, 오염된 이미지 파일을 로딩하는데 필요한 피클 라이브러리 임포트

2. 오염된 이미지를 파이토치의 텐서 형태로 읽는다면 이미지는 픽셀값들을 숫자로 늘어놓은 행렬로 표현된다. 복원해야할 오염된 이미지 역시 랭크1의 벡터로 표현한 텐서 데이터이다. 10,000개의 원소를 지닌 [100,100] 모양의 행렬이 [10000] 모양의 벡터로 표현된 형식,맷플롭립을 이용해 [100,100]의 형태로 바꾼후 시각화.

3. 이미지를 오염시키는 weird_function()함수의 코드

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

5. 무작위 값을 가진 텐서를 생성한다. 무작위 텐서는 오염된 이미지와  같은 모양과 랭크를 가져야 한다. [100,100] 모양의 벡터 텐서

6.경사하강법은 여러 번 반복하기 때문에 학습의 진행 정도인 학습률을 정하는 매개변수인 학습률을 설정한다 (lr = 0.8)

7. 경사하강법의 몸체인 for 반복문을 구현한다.

*오차함수를 random_tensor로 미분하기위해 requires_grad를 True로 설정

*무작위 텐서를 weird_function()함수를 통과시켜 가설을 구함

*distance_loss()함수에 가설과 오염된 이미지를 입력해 오차를 계산

*loss.backward()함수를 호출해 loss를 random_tensor로 미분

*파이토치 자동 기울기 계산 비활성화, random_tensor.grad에는 loss.backward()함수에서 계산한 loss의 기울기, 즉 loss가 최댓점이 되는 곳의 방향이 들어있음. 이 방향의 반대 쪽으로 random_tensor를 학습률(lr)만큼 이동시킴

*for문이 1000번 반복 될때마다 오차를 출력

*반복문이 끝나고 random_tensor가 제대로 복원되었는지 확인

*타임스퀘어 풍경이 복원됨

'딥러닝(파이토치)' 카테고리의 다른 글

3장. 파이토치로 구현하는 ANN 3.1절  (0) 2020.11.10
1장. 딥러닝과 파이토치  (0) 2020.11.10
딥러닝(파이토치맛)  (0) 2020.11.10