PyTorch에서의 Gradient Descent에 대해서 간단하게 먼저 살펴본다
파이토치를 이용해서 선형회귀 모델을 먼저 만들고,
경사하강법으로 학습하는 과정을 코드로 작성해보자.
파이토치는 데이터의 기본 단위로 텐서(Tensor)를 사용한다
텐서는 넘파이에서의 array()와 함수와 동일하다.
np.array()함수와 동일하다.
In [1]:
import tensorflow as tf
import keras as k
import torch # 파이토치 프레임워크를 불러온다.
import torchvision # 파이토치 내에서도 vision에 해당하는 모델로서, 이미지 Processing에 특화된 모듈을 말한다.
import torch.nn as nn
import torchvision.transforms as trainsforms # 데이터 Augmentation에 사용될 모듈이다. 데이터 변형...
import warnings # 에러를 제거하는 라이브러리
warnings.filterwarnings('ignore')
print("텐서플로우 버전 = ", tf.__version__)
print("케라스 버전 = ", k.__version__)
print("토치 버전 = ", torch.__version__)
텐서플로우 버전 = 2.4.1
케라스 버전 = 2.4.3
토치 버전 = 1.7.1
1. Forward Propagation¶
NN Model Generator¶
In [2]:
x = torch.randn(10, 3) # 10x3, 10은 Banchsize 즉, bias를 말한다. >> 즉 3x1 인경우이고,
y = torch.randn(10, 2) # 10x2 10을 제외한 값 2x1이 된다.
# w는 3행 2열이 나와야한다.
In [3]:
x
Out[3]:
tensor([[-0.6166, 0.8036, 0.3109],
[ 2.3607, 0.4783, 0.3376],
[ 0.6354, 1.2028, 0.1827],
[ 0.8027, -1.0163, 1.1267],
[ 0.9482, -1.4984, 1.0720],
[-0.8113, -0.4850, -0.7960],
[-0.0652, 1.7412, -0.0438],
[ 1.8561, 0.8701, -0.7129],
[ 0.2525, 0.3605, -0.0379],
[-1.8128, -0.6133, 1.1490]])
In [4]:
y
Out[4]:
tensor([[-1.8242, -0.0768],
[-0.2447, 0.2557],
[-0.2924, 0.0328],
[ 0.8802, 1.5150],
[ 0.2947, 0.9969],
[ 1.1399, 0.7837],
[ 0.0763, 0.7472],
[-1.3609, -0.7882],
[ 0.6819, -1.5623],
[-0.2274, 1.0587]])
In [5]:
linear = nn.Linear(3,2) # 모델을 만들었다.
In [6]:
print(linear.weight) # linear에서 Transpose시켜서 나오기 때문에 행과 열이 뒤바껴서 나온다.
# 3행 2열이어야 하는데 2행 3열로나옴.
Parameter containing:
tensor([[ 0.4827, 0.3069, -0.3660],
[ 0.3638, -0.4746, 0.5639]], requires_grad=True)
In [7]:
print(linear.bias) # 10은 공통의 값이라서 생략되어서 출력된것이다.
Parameter containing:
tensor([ 0.1770, -0.0336], requires_grad=True)
선정의 - loss Function , optimization으로 어떤걸 사용할지 정한다.¶
In [8]:
'''
linear.parameters()을 출력하면 객체가나오는데 학습의 주체를 해킹하고 있는 객체를 말한다.
parameters() 학습의 주체를 해킹하는 함수
w,b를 해킹 하고 있음.
그래서 linear.parameters()를 그대로 넣으면 됨.
'''
linear.parameters()
Out[8]:
<generator object Module.parameters at 0x000001B15047DF90>
In [9]:
loss_function = nn.MSELoss()
optimizer = torch.optim.SGD(linear.parameters(), lr=0.01) # 학습하는 주체는 w,b가 된다., learning rate를 넣는다.
모델에 입력값을 넣고, 모델이 예측한 값을 출력한다¶
In [10]:
pred = linear(x)
loss값을 구한다.¶
In [11]:
loss = loss_function(pred, y) # 예측값과 답지를 넣음
In [12]:
print('Loss before step BackPropagation : ', loss)
Loss before step BackPropagation : tensor(1.4389, grad_fn=<MseLossBackward>)
텐서의 단위로 나옴.. 1.5548의 로우값이 나옴¶
In [13]:
print('Loss before step BackPropagation : ', loss.item())
Loss before step BackPropagation : 1.4389464855194092
로우값만 나옴¶
: 1.5547583103179932
2. Back ProPagation¶
dL/dW¶
In [14]:
loss.backward() # 편미분이 돌아감 Loss값에 따른 w,b값의 미분한값 아직 학습진행은 안됨.
In [15]:
print('dL/dW : ', linear.weight.grad)
print('dL/db : ', linear.bias.grad)
dL/dW : tensor([[ 1.0305, 1.0167, -0.2822],
[ 0.5953, -0.1912, 0.0229]])
dL/db : tensor([ 0.3978, -0.1422])
위처럼 w, b값이 바뀌었다 한번 확인해보자
In [16]:
# 이때 위에서 변경된 값으로 하강을 진행한다.
optimizer.step()
In [17]:
# 반복 효과
pred = linear(x)
In [18]:
loss= loss_function(pred, y)
In [19]:
print(loss.item()) # 0.027 정도 loss값을 낮췄다.
1.4117151498794556
'workSpace > PYTHON' 카테고리의 다른 글
[DL] CNN Overview, Convolution Filter & Feature-map, Activation Function & Pooling (0) | 2021.01.29 |
---|---|
[DL] Basic analysis of using SGD Optimizer with code. (2) (0) | 2021.01.28 |
[DL] Back Propagation (0) | 2021.01.28 |
[DL] Linear Classification, Forward propagation, Full loss Function (0) | 2021.01.27 |
[DL] Knowledge and Algorithm Overview (0) | 2021.01.27 |