2023.05.08 - [TIL] - [AI] 딥러닝과 머신러닝, 퍼셉트론 개념 3주 10일차-1
[AI] 딥러닝과 머신러닝, 퍼셉트론 개념 3주 10일차-1
딥러닝 딥러닝 과 머신러닝 그리고 인공지능 중에 가장 넓은 개념은 인공지능이다. 인공지능이 계산, 학습 등 인간의 지적능력을 컴퓨터를 통해 구현하는 기술이라면 머신러닝은 특정 부분을
devmelonlee.tistory.com
이전 글에서는 딥러닝의 개념에 대해 알아보았다.
이번에는 코드로 구현해보자
딥러닝의 수식
퍼셉트론과 다층 퍼셉트론, 출처 : nextobe.com
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)
실행 결과)
실행결과는 다음과 같다.