10장 모델 설계
10.1 모델의 정의
- 딥러닝의 모델을 설정하고 구동하는 부분은 모두 model이라는 함수를 선언하며 시작
- model = Sequential() : 딥러닝의 구조를 짜고 층을 설정
- model.compile() : 모델을 컴퓨터가 알아들을 수 있게끔 컴파일
- model.fit() : 모델을 실제로 수행하는 부분
10.2 입력층, 은닉층, 출력층
model = Sequential()
model.add(Dense(30, input_dim=10, activation='relu')) #은닉층
model.add(Dense(1, activation='sigmoid')) #출력층
- model.add() 함수를 통해 새로운 층 형성
- 맨 마지막 층은 '출력층', 나머지는 '은닉층'
- Dense() 함수의 첫 번째 인자는 노드(가중합)의 개수
- Dense() 함수의 input_dim은 입력변수의 개수
- Dense() 함수의 activation은 활성화 함수
10.3 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
- 모델이 효과적으로 구현될 수 있게 환경을 설정
- 손실 함수는 선형회귀의 경우 평균 제곱 계열 중 하나, 이항 분류를 위해서는 binary_crossentropy, 다항분류는 categorical_crossentropy 선택
- 손실 함수를 통해 계산된 오차는 옵티마이저를 적절히 활용하도록 만듦
- metrics()는 모델이 컴파일될 때 모델 수행의 결과를 나타내게 설정하는 부분
10.4 모델 실행하기
history=model.fit(X, y, epochs=5, batch_size=16)
[output]
Epoch 1/5
30/30 [==============================] - 1s 2ms/step - loss: 5.8495 - accuracy: 0.1489
Epoch 2/5
30/30 [==============================] - 0s 2ms/step - loss: 0.6155 - accuracy: 0.7191
Epoch 3/5
30/30 [==============================] - 0s 2ms/step - loss: 0.4862 - accuracy: 0.8511
Epoch 4/5
30/30 [==============================] - 0s 2ms/step - loss: 0.4519 - accuracy: 0.8511
Epoch 5/5
30/30 [==============================] - 0s 3ms/step - loss: 0.4490 - accuracy: 0.8511
- 학습 프로세스가 모든 샘플에 대해 한 번 실행되는 것을 1 epoch라고 함
- batch_size는 샘플을 한 번에 몇 개씩 처리할지 정하는 부분
- batch_size가 너무 크면 학습 속도가 느려지고, 너무 작으면 각 실행 값의 편차가 생겨 전체 결괏값이 불안정해짐
12장 다중 분류 문제 해결하기
12.1 다중 분류 문제
- 아이리스 품종 데이터의 경우 클래스가 두 개가 아니라 세 개, 이처럼 여러 개의 답 중 하나를 고르는 분류 문제를 다중 분류라고 함
12.2 상관도 그래프
import pandas as pd
# 깃허브에 준비된 데이터를 가져옵니다.
!git clone https://github.com/taehojo/data.git
# 아이리스 데이터를 불러옵니다.
df = pd.read_csv('./data/iris3.csv')
df.head()
- 시본(seaborn) 라이브러리에 있는 pairplot()를 써서 전체 상관도 그래프 출력
- hue 옵션을 통해 주어진 데이터 중 어떤 카테고리를 중심으로 그래프를 그릴지 설정
- 가운데 대각선은 가로축과 세로축이 같으므로 단순히 해당 속성에 따라 각 품종들이 어떻게 분포하는지 보여줌
import seaborn as sns
import matplotlib.pyplot as plt
sns.pairplot(df, hue='species');
plt.show()
12.3 원-핫 인코딩
- 불러온 데이터 프레임을 X와 y로 나누고 결과 확인
# 속성을 X, 클래스를 y로 저장
X = df.iloc[:,0:4]
y = df.iloc[:,4]
# X와 y의 첫 5줄을 출력
print(X[0:5])
print(y[0:5])
[output]
sepal_length sepal_width petal_length petal_width
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
0 Iris-setosa
1 Iris-setosa
2 Iris-setosa
3 Iris-setosa
4 Iris-setosa
Name: species, dtype: object
- 저장한 y값이 숫자가 아닌 문자이므로 모두 숫자형으로 바꿔줘야 함
- 여러 개 값으로 된 문자열을 0과 1로만 이루어진 형태로 만들어주는 과정을 원-핫 인코딩이라고 함
- 판다스가 제공하는 get_dummies() 를 사용하여 수행
# 원-핫 인코딩 처리
y = pd.get_dummies(y)
# 원-핫 인코딩 결과 확인
print(y[0:5])
[output]
Iris-setosa Iris-versicolor Iris-virginica
0 1 0 0
1 1 0 0
2 1 0 0
3 1 0 0
4 1 0 0
12.4 소프트맥스
- 세 가지 확률을 모두 구해야할 때 사용되는 함수는 소프트맥스 함수
- 각 항목당 예측 확률을 0과 1 사이의 값으로 나타내어 샘플당 예측 확률의 총합이 1인 형태로 바꾸어 줌
- 모델 실행 결과 30번 반복했을 때 정확도가 96.0%가 나옴
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 모델 설정
model = Sequential()
model.add(Dense(12, input_dim=4, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.summary()
# 모델 컴파일
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 모델 실행
history=model.fit(X, y, epochs=30, batch_size=5)
[output]
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_15 (Dense) (None, 12) 60
_________________________________________________________________
dense_16 (Dense) (None, 8) 104
_________________________________________________________________
dense_17 (Dense) (None, 3) 27
=================================================================
Total params: 191
Trainable params: 191
Non-trainable params: 0
_________________________________________________________________
Epoch 1/30
30/30 [==============================] - 0s 2ms/step - loss: 1.9954 - accuracy: 0.3333
Epoch 2/30
30/30 [==============================] - 0s 2ms/step - loss: 1.4589 - accuracy: 0.3333
Epoch 3/30
30/30 [==============================] - 0s 2ms/step - loss: 1.2054 - accuracy: 0.3333
...
Epoch 29/30
30/30 [==============================] - 0s 2ms/step - loss: 0.2068 - accuracy: 0.9733
Epoch 30/30
30/30 [==============================] - 0s 2ms/step - loss: 0.1930 - accuracy: 0.9667
'데이터 > 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] Chapter 4 | 딥러닝 기본기 다지기 - 모델 성능 향상시키기 (0) | 2023.02.14 |
---|---|
[모두의 딥러닝] Chapter 4 | 딥러닝 기본기 다지기 - 모델 성능 검증하기 (0) | 2023.02.14 |
[모두의 딥러닝] Chapter 3 | 신경망의 이해 - 오차 역전파 (0) | 2023.02.04 |
[모두의 딥러닝] Chapter 3 | 신경망의 이해 - MLP (0) | 2023.02.04 |
[모두의 딥러닝] Chapter 3 | 신경망의 이해 - 퍼셉트론 (1) | 2023.02.04 |