2023.05.08 - [TIL] - [AI] 딥러닝과 머신러닝, 퍼셉트론 개념 3주 10일차-1
이전 글에서는 딥러닝의 개념에 대해 알아보았다.
이번에는 코드로 구현해보자
1. 1차원 에서의 딥러닝
딥러닝은 크게 다음의 4단계를 거친다.
1. 데이터 불러오기
2. 모델 구성
3. 컴파일, 훈련
4. 예측, 평가
1.1 데이터 불러오기
입력 값 x와 결과 값 y 를 불러온다.
1차원 리스트의 형태로 접근 가능하며 1-> 1, 2->2, 3->3 의 관계를 통해 다음 x에 값이 주어지면 어떤 y가 출력 될지 생성 하는 알고리즘을 구성해볼 것이다.
# 1. 데이터
import numpy as np # numpy 라이브러리 불러오기
x=np.array([1,2,3]) # 입력 값
y=np.array([1,2,3]) # 결과 값
# 4. 예측, 평가
loss = model.evaluate(x,y) # 데이터 가져와서 평가하기
print('loss: ', loss)
result = model.predict([4]) # y가 제대로 나오는지 확인
print('4의 예측값: ', result)
1.2 모델 구성
딥러닝을 만들 때 성능을 크게 높힐 수 있는것은 무엇일까?
히든 레이어(은닉층) 의 개수 조절이 있다. 데이터의 양에 따라 은닉층 조절을 한다. 은닉층이 적은것 보다는 많은 것이 좋다. 그렇다고 너무 많으면 계산하는데 시간이 많이 걸린다.
# 2. 모델 구성
from keras.models import Sequential # 케라스 모델에서 Sequential 불러오기
from keras.layers import Dense # 케라스 모델에서 Dense 불러오기
model = Sequential() # sequential 가져오기
model.add(Dense(4, input_dim=1)) # 입력층, 첫번째 뉴런 개수
model.add(Dense(10)) # 은닉층 1
model.add(Dense(5)) # 은닉층 2
model.add(Dense(3)) # 은닉층 3
model.add(Dense(2)) # 은닉층 4
model.add(Dense(1)) # 출력층
Dense(n) : 은닉층 개수 n
input_dim : 차원의 개수, 여기서는 1차원 리스트 이므로 값은 1로 설정.
은닉층이 있는 퍼셉트론을 MLP : Multi layer Perceptron 이라고 한다. 대부분의 경우에서 쓰인다.
만약 은닉층이 없어도 딥러닝 알고리즘은 작동을 한다. 바로 SLP : Single Layer Perceptron이다.
1.3 컴파일, 훈련
훈련을 할 때에 어떻게 할 것인가? 중요한건 loss와 optimimzer이다.
앞서 말했듯 딥러닝 의 목표 는 최적의 매개변수 weight와 bias 를 찾는 것이다.
여기에서 편향값에는 loss와 optimizer에 쓰이는 알고리즘을 선택하여 계산에 반영한다.
# 3. 컴파일, 훈련
model.compile(loss='mse',optimizer='adam') # loss: 손실 함수, optimizer: 최적값
model.fit(x,y,epochs=1000) # epochs : 반복 횟수
loss : 손실 함수, 실제값이 예측값과 차이(오차)를 비교하는 지표이다.
mse : 평균 제곱 오차 , 값이 마이너스가 나올 수 있기 때문에 제곱해서 양수값으로 나타낸다.
optimizer : 최적값을 찾는다 주로 성능이 좋은 adam 알고리즘이 사용된다
epochs : 훈련 횟수 : 100부터 시작하여 결과값과 비교하며 늘려가는 것이 좋다.
1.4 예측, 평가
# 4. 예측, 평가
loss = model.evaluate(x,y) # 데이터 가져와서 평가하기
print('loss: ', loss)
result = model.predict([4]) # y가 제대로 나오는지 확인
print('4의 예측값: ', result)
빨리 찾는것도 문제다. 왜냐하면 답을 지나갈 수 있기 때문이다.
느리게 찾는 것도 문제다. 자원을 많이 소모하기 때문
x를 넣었을 때 y가 나온다. 그 값이 얼마나 차이가 나는 지 출력한다.
실행 결과)
x가 1,2,3, 일때의 y 값을 학습해서 이후 x값을 4라고 할때 어떤 예측값을 결과로 보여주는지 확인해 보았다.
4가 나오면 완벽하게 맞다고 할 때, 예측값은 3.9999943이 나왔다.
loss값은 0.00000000000716227077646181 이다.
2. 2차원 에서의 딥러닝
데이터를 가져올 때 데이터의 양이 많다면 이게 얼만큼 큰지, 몇차원 리스트인지 확인하기 어렵다.
따라서 shape를 이용해서 주어진 리스트의 차원 크기를 확인할 수 있다.
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
# 1. 데이터
x = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 1, 1, 2, 1.1, 1.2, 1.4, 1.5, 1.6]]) # 2차원 배열
y = np.array([11, 12, 13, 14, 15, 16 ,17, 18, 19, 20])
print(x.shape) # (2, 10) , 주어진 배열의 차원 크기를 반환
print(y.shape) # (10,)
x = x.transpose()
# x = x.T
print(x.shape) # (10, 2)
# 2. 모델 구성
model = Sequential()
model.add(Dense(10, input_dim=2)) # 입력층
model.add(Dense(100)) # 은닉층
model.add(Dense(50))
model.add(Dense(30))
model.add(Dense(20))
model.add(Dense(10))
model.add(Dense(1)) # 출력층
# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=5)
# 4. 평가, 예측
loss = model.evaluate(x, y)
print('loss : ', loss)
result = model.predict([[10, 1.6]])
print("[10]과 [1.6]의 예측값: ", result)
주어진 리스트x의 차원이 2 이므로 input_dim을 2로 설정했다.
실행 결과)
20이 나와야 하는데 20.9~ 이 결과 값으로 나오게 되었다
은닉층 노드의 조정과 편향값 조정을 통해 예측값을 더 결과치에 근사하게 만들 수 있다.
3. 3차원 에서의 딥러닝
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
# HW 1 모델 구성부터 평가 예측까지 완성하시오
# 예측 [[10, 1.6, 1]]
# 1. 데이터
x = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 1, 1, 2, 1.1, 1.2, 1.4, 1.5, 1.6],
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]]) # 3차원 배열
y = np.array([11, 12, 13, 14, 15, 16 ,17, 18, 19, 20])
print(x.shape) # (3, 10) , 주어진 배열의 차원 크기를 반환
print(y.shape) # (10,)
x = x.transpose()
# x = x.T
print(x.shape) # (10, 3)
# 2. 모델 구성
model = Sequential()
model.add(Dense(10, input_dim=3)) # 입력층
model.add(Dense(100)) # 은닉층
model.add(Dense(50))
model.add(Dense(30))
model.add(Dense(20))
model.add(Dense(10))
model.add(Dense(1)) # 출력층
# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=5)
# 4. 평가, 예측
loss = model.evaluate(x, y)
print('loss : ', loss)
result = model.predict([[10, 1.6, 1]])
print("[10]과 [1.6]의 예측값: ", result)
실행 결과)
실행결과는 다음과 같다.