딥러닝
[ 딥러닝 ] 선형 회귀
예진또이(애덤스미스 아님)
2023. 7. 6. 17:50
728x90
💥 단항 선형 회귀 실습
* 한 개의 입력이 들어가서 한 개의 출력이 나오는 구조
import torch # 오픈 소스 기계 학습 라이브러리 모듈
import torch.nn as nn # nn 이란? 인경신경망을 구현하기 위한 도구와 모듈제공
import torch.optim as optim # optim 이란 다양한 최적화 알고리즘 구현
import matplotlib.pyplot as plt
# 파이썬 코드를 재실행해도 같은 결과가 나올 수 있도록 랜덤시드를 설정
torch.manual_seed(17)
--------------------------------------------------------------------
# 결과
<torch._C.Generator at 0x7f5e8c1d0e10>
# 1차원 텐서를 생성 / 텐서란? 다차원 배열을 나타내는 데이터 구조( 기본적으로 숫자데이터를 저장하고 다양한 수학적 연산을 수행)
X_train = torch.FloatTensor([[1],[2],[3]])
y_train = torch.FloatTensor([[2],[4],[6]])
print(X_train)
print(X_train.shape)
print(y_train)
print(y_train.shape)
------------------------------------------------------------------------------------------------
# 결과
tensor([[1.],
[2.],
[3.]])
torch.Size([3, 1])
tensor([[2.],
[4.],
[6.]])
torch.Size([3, 1])
💢산점도 그리기
#새로운 그림(figure) 생성, 그림의 크기를 지정하는 부분( 가로, 세로)
plt.figure(figsize = (8, 5))
# X_train,y_train데이터를 이용하여 산점도 그림
# x_train x축에 해당하는 입력 데이터 ,y_train y축에 해당하는 목표 변수(타깃)
plt.scatter(X_train, y_train)
# H = Wx + b
model = nn.Linear(1, 1) # 데이터를 하나 넣으면 하나 출력
print(model)
----------------------------------------------------------
# 결과
Linear(in_features=1, out_features=1, bias=True)
# out_features=1 출력의 크기가 1임을 의미
# in_features=1 입력의 크기가 1임을 의미
# bias=True 모델에 편향(bias)이 적용된다는 것을 의미
# 편향은 선형 변환의 결과에 추가적인 상수항을 더해주는 역할을 함
# 기울기와 바이어스가 나옴 # 학습전이라 임의의 값으로 설정됨
print(list(model.parameters()))
--------------------------------------------------------------
# 결과
# 선형 모델의 가중치를 나타냄
[Parameter containing:
tensor([[-0.1315]], requires_grad=True),
# 모델의 편향을 나타냄 편향은 선형 변환 결과에 더해지는 상수항으로, 모델의 출력에 영향을 미치는 역할을함
Parameter containing:
tensor([0.0702], requires_grad=True)]
# 비용함수 = 한번 하고 갱신, 한번 하고 갱신
# 오차함수 = 한 바퀴 돌고 확인
# 비용함수
# Cost Function = Loss Function
y_pred = model(X_train)
print(y_pred)
--------------------------------------------------
# 결과
tensor([[-0.0613],
[-0.1928],
[-0.3243]], grad_fn=<AddmmBackward0>)
💢MSE 오차 확인
((y_pred - y_train) ** 2).mean()
----------------------------------
# 결과
tensor(20.6086, grad_fn=<MeanBackward0>)
💢MSELoss 오차 확인
= 평균 제곱 오차(Mean Squared Error) 손실함수
loss = nn.MSELoss()(y_pred, y_train)
loss
-----------------------------------------------
# 결과
tensor(20.6086, grad_fn=<MseLossBackward0>)
# 데이터 [[1],[2],[3]]
# W : [[0.6604]] b :[-0.7523]
# pred : [[-0.0919], [ 0.5686], [ 1.2290]]
print(0.6604*1 + -0.7523)
print(0.6604*2 + -0.7523)
print(0.6604*3 + -0.7523)
------------------------------------------------------
# 결과
-0.09189999999999998
0.5685
1.2288999999999999
1️⃣ 경사하강법(Gradient Descent)
* 비용 함수의 값을 최소로 하는 w 와 b를 찾는 알고리즘을 옵티마이저 알고리즘이라고 함
* 최적화 알고리즘
* 옵티마이저 알고리즘을 통해 w와 b를 찾아내는 과정을 학습이라고 부름
* 경사하강법은 가장 기본적인 옵티마이저 알고리즘
# 학습률(Learning rate): 한 번 움직이는 거리(increment step)
optimizer = optim.SGD(model.parameters(), lr=0.01)
loss = nn.MSELoss()(y_pred, y_train)
# gradient를 초기화
optimizer.zero_grad()
# 비용함수를 미분하여 gradient(기울기) 재계산
loss.backward() # 미분을 취해서 기울기와 절편을 새롭게 찾아냄
# W와 b를 업데이트
optimizer.step()
print(list(model.parameters()))
# W: [[-0.2350]] b:[0.0925]
# W: [[-0.0301]] b:[0.1801]
--------------------------------------------------------------------
# 결과
[Parameter containing:
tensor([[0.0646]], requires_grad=True), Parameter containing:
tensor([0.1541], requires_grad=True)]
#mseLoss() 평균제곱곱차
loss = nn.MSELoss()(y_pred, y_train)
loss
----------------------------------------
#결과
tensor(20.6086, grad_fn=<MseLossBackward0>)
❗ 학습
# 학습(Training)
# 반복 훈련을 하면서 틀린 W, b를 수정하여 오차를 계속 줄여나감
# epochs: 반복 훈련 횟수
epochs = 10000
for epoch in range(epochs + 1):
y_pred = model(X_train)
loss = nn.MSELoss()(y_pred, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f'Epoch {epoch}/{epoch} Loss: {loss:.6f}')
💨결과
#parameter은 nn.module 클래스 방법( 모델이 가능한 확률을 반환하는 기여를 함)
print(list(model.parameters()))
# 예측하는 값
# 1.9721 * x + 0.0634
----------------------------------------------------------------
# 결과
[Parameter containing:
tensor([[2.0000]], requires_grad=True), Parameter containing:
tensor([8.7018e-06], requires_grad=True)]
X_test = torch.FloatTensor([[10], [12.1234]])
y_pred = model(X_test)
print(y_pred)
-------------------------------------------------------
# 결과
tensor([[20.0000],
[24.2468]], grad_fn=<AddmmBackward0>)
💥 다중 선형 회귀
* 여러 개의 입력이 들어가서 한 개의 출력이 나오는 구조
X_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70],])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
print(X_train)
print(X_train.shape)
print(y_train)
print(y_train.shape)
-----------------------------------------------------------------------
# 결과
tensor([[ 73., 80., 75.],
[ 93., 88., 93.],
[ 89., 91., 90.],
[ 96., 98., 100.],
[ 73., 66., 70.]])
torch.Size([5, 3])
tensor([[152.],
[185.],
[180.],
[196.],
[142.]])
torch.Size([5, 1])
# H= W1x1 + W2x2 + W3x3 + b
model = nn.Linear(3,1)
print(model)
-----------------------------------
#결과
Linear(in_features=3, out_features=1, bias=True)
print(list(model.parameters()))
----------------------------------------------------------------------
#결과
[Parameter containing:
tensor([[ 0.3813, -0.4343, -0.5435]], requires_grad=True), Parameter containing:
tensor([0.0570], requires_grad=True)]
# 확률적 경사 하강법
optimizer = optim.SGD(model.parameters(),lr=0.00001)
#학습
epochs = 10000
for epoch in range(epochs + 1):
y_pred = model(X_train)
loss = nn.MSELoss()(y_pred, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f'Epoch {epoch}/{epoch} Loss: {loss:.6f}')
print(list(model.parameters()))
# 결과
[Parameter containing:
tensor([[1.1287, 0.5494, 0.3358]], requires_grad=True), Parameter containing:
tensor([0.0658], requires_grad=True)]
x_test = torch.FloatTensor([[82,92,82]])
y_pred=model(x_test)
print(y_pred)
-------------------------------------------------------
# 결과
tensor([[170.6976]], grad_fn=<AddmmBackward0>)
728x90
반응형