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입니다.
![](https://blog.kakaocdn.net/dn/tvGm3/btr1bd6rGO2/hzYDQcMStrhKb70RsTr6DK/img.png)
또한 텐서의 랭크와 shape은 unsqueeze(), squeeze(), view() 함수를 사용해서 인위로 바꿀수도 있습니다. 이 함수들은 원소 개수는 유지하며 모양과 차원만 변경합니다.
● unsqueeze(): 지정한 자리에 1이라는 차원 값을 추가해주는 함수입니다. 아래 코드는 0번째자리에 1이라는 차원 값이 추가됩니다.
x=torch.unsqueeze(x, 0)
![](https://blog.kakaocdn.net/dn/GUYay/btr01T8ynMH/sg4wIW0H0nvwPVvSeYCqtK/img.png)
● squeeze(): 1이라는 차원 값을 제거해주는 함수입니다.
x=torch.squeeze(x)
![](https://blog.kakaocdn.net/dn/uQu6C/btr07AnpKyc/UTxjlklLpbOZEzzV03w6a1/img.png)
● view(): 지정한 모양으로 텐서를 변경합니다.
x = x.view(9)
![](https://blog.kakaocdn.net/dn/BnuRx/btr1pXusAld/MddqNRQs2KxRSMkz4BKKP1/img.png)
▶ 텐서를 이용한 연산과 행렬곱
- A의 열 수와 B의 행 수는 같아야합니다.
- 행렬곱 A x B의 결과 행렬의 행 개수는 A와 같고, 열의 개수는 B와 같습니다.
![](https://blog.kakaocdn.net/dn/ck3sP9/btr1fO58RP0/zSH7a79MTpDkzclttWdZNk/img.png)
▶Autograd
● 수식의 기울기를 자동으로 계산하는 것
● 경사하강법(gradient descent) : 오차를 수학 함수로 표현하여 미분한 뒤, 이 함수의 기울기를 구해 오차의 최솟값이 있는 방향을 찾아내는 알고리즘입니다.
=> 머신러닝에서의 오차란?
정답(ground truth) - 예측 값(prediction value) = 거리(distance)
학습 데이터에 대하여 이 거리들의 평균 = 오차(loss)
![](https://blog.kakaocdn.net/dn/OYUfG/btr1pWvzTWE/eMYWXRrCOobmnaF21wcjy1/img.png)
● 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))
![](https://blog.kakaocdn.net/dn/lHVCQ/btr1uebAx25/CZ71K2AgI1l4Er6WY8VdVK/img.png)
- 무작위 텐서를 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
학습률이란 학습을 얼마나 급하게 진행하는가를 정하는 값입니다.
![](https://blog.kakaocdn.net/dn/sR5IS/btr1blcrVum/5WGKsFdG5D1kiFktg30WQ0/img.png)
- 일정 반복을 통해 학습을 진행하는 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)
- 복원된 이미지를 시각화한 모습입니다.
![](https://blog.kakaocdn.net/dn/bCL2cx/btr1f0ZRHp3/sWUB52iLt0VS9FrbENshI0/img.png)
'AI Research > Deep Learning' 카테고리의 다른 글
[Pytorch-기초강의] 이미지 처리 능력이 탁월한 CNN(Deep CNN) (0) | 2023.03.01 |
---|---|
[Pytorch-기초강의] 이미지 처리 능력이 탁월한 CNN(CNN의 기초) (0) | 2023.03.01 |
[Pytorch-기초강의] 패션 아이템을 구분하는 DNN (1) | 2023.03.01 |
[Pytorch-기초강의] 파이토치로 구현하는 ANN(ANN) (0) | 2023.03.01 |
[Pytorch-기초강의] 1. 딥러닝과 파이토치 (0) | 2023.03.01 |