AI/모두의 딥러닝

[Deep Learning : 딥러닝] 딥러닝 모델 설계

LiDARian 2021. 6. 18. 18:10
반응형

https://knowledgeforengineers.tistory.com/69?category=946640
에서 봤던 첫 번째 코드를 다시 살펴보자.

 

딥러닝 입문 - 최소제곱법, 평균제곱오차, 딥러닝의 기본 연산(method of least squares, Mean squared error)

참고도서 : 모두의 딥러닝, 제2판(조태호, 2020) 개발환경 : google colab 데이터를 입력하고 분석하는 과정을 training이라고한다. 텅빈 좌표평면에 data를 하나씩 놓고 이를 분류하는 과정이다. 이 dat

knowledgeforengineers.tistory.com

아래 코드는 폐암 수술 환자의 생존율을 예측하는 코드이다.
환자의 dataset을 보면 1 ~ 17번째까지는 분석 대상이고, 그 분석 데이터를 기반으로 18번째 항목을 분류(문제풀이)하는 것이다. 여기서 18번째를 class, 1부터 17까지를 attribute라고 한다.

 

코드를 살펴보자. 어려운 부분은 주석으로 더 설명해놓았다.

# Google Colab에서만 사용하는 코드
# 파일 선택을 통해 예제 데이터를 내 컴퓨터에서 불러옵니다.
from google.colab import files
uploaded = files.upload()
my_data = 'ThoraricSurgery.csv'

# 딥러닝을 구동하는 데 필요한 케라스 함수를 불러옵니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 라이브러리 소환시 import를 사용한다

# 필요한 라이브러리를 불러옵니다.
import numpy as np
import tensorflow as tf
# 라이브러리 소환시 import를 사용한다

# 실행할 때마다 같은 결과를 출력하기 위해 설정하는 부분입니다.
np.random.seed(3)
tf.random.set_seed(3)

# 불러온 데이터를 적용합니다.
Data_set = np.loadtxt(my_data, delimiter=",")

# 환자의 기록과 수술 결과를 X와 Y로 구분하여 저장합니다.
# [row, column] 형식을 따른다.
X = Data_set[:,0:17]
Y = Data_set[:,17]
# 세로줄(1~470)은 전체, 가로줄(1~18)은 니눠서 dataset생성한다.

# 딥러닝 구조를 결정합니다(모델을 설정하고 실행하는 부분입니다).
# model.add() 딥러닝 모델에 새로운 층을 추가한다.
# 이를 통해서 추가되는 층은 마지막 층을 제외하면 모두 은닉층으로 처리된다.
# 맨 처음 Dense는 은닉층과 입력층의 기능을 동시에 하게 된다.
model = Sequential()

# Dense(30, input_dim=17, activation='relu')는 30개의 노드, input_dim은 입력층 노드의 개수, activation은 사용할 활성화 함수를 지정
model.add(Dense(30, input_dim=17, activation='relu'))

# Dense(1, activation='sigmoid')는 출력층. 출력층의 노드의 수는 1, 입력층은 아니므로 input_dim은 지정하지 않고, activation은 sigmoid로 지정
model.add(Dense(1, activation='sigmoid'))

# 딥러닝을 실행합니다.
# compile()에서 딥러닝의 여러가지 환경을 설정할 수 있다.
# loss(오차함수)는 평균제곱오차, 최적화함수(경사하강법)는 adam, metrics는 모델 컴파일 시 모델 수행 결과를 출력하게끔 설정하는 부분.
# metrics는 테스트 샘플을 학습과정에서 제외시킴으로써 과적합 문제를 방지하는 기능을 담고 있다.(?)
# 평균제곱오차함수는 수렴하기까지 속도가 오래 걸리므로 교차 엔트로피 계열의 함수를 통해서 빠르게 수렴할 수 있도록 할 수 있다.
# 이경우 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])로 바꾸면 된다.
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

# 주어진 데이터를 불러 실행
# X가 속성(혹은 feature), Y가 클래스, 100회 반복, 1회 시행시 샘플(혹은 instance) 개수 10개
# batch_size는 너무크면 학습 속도가 느리고 너무 작으면 실행 값의 편차가 크다.
model.fit(X, Y, epochs=100, batch_size=10)

 


 

model = Sequential()

model.add(Dense(30, input_dim=17, activation='relu'))

model.add(Dense(1, activation='sigmoid'))

Sequential()은 deeplearning의 각 layer를 차례로 쌓을 수 있게 해준다.
model.add()를 이용해 필요한 layer를 쌓는다.
Dense()는 각 layer의 특성을 결정한다.
예를 들어서, Dense(30, input_dim=17, activation='relu')는 30개의 노드, input_dim은 입력층 노드의 개수, activation은 사용할 활성화 함수를 지정한다.

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=100, batch_size=10)

딥러닝 모델을 설정하고 구동하는 것은 model = Sequential()로 함수를 선언하면서 시작한다.
model.compile()은 층을 쌓은 모델을 기계어로 컴파일하는 부분이고,
model.fit()은 모델을 가동해서 학습을 실시하는 부분이다.

 


model.compile()의 오차함수는 다음과 같은 것들이 있다.

평균 제곱오차 함수로는
mean_squared_error
mean_absolute_error
mean_absolute_percentage_error
mean_absolute_logarithmic_error

 

교차 엔트로피 함수로는
categorical_crossentropy
binary_crossentropy
등이 있다.

 

보통은 binary_crossentropy를 사용해주면 된다.


 

실행 때마다 같은 가중치를 받게하기 위해
variable 객제를 생성하기 전에 다음과 같은 code를 붙인다.

np.random.seed(3)
tf.random.set_seed(3)

random seed와 관련해서 참고할만한 사이트는 아래 세가지 정도가 있다.

텐서플로우 set_seed 공식문서
https://www.tensorflow.org/api_docs/python/tf/random/set_seed?hl=ko

스택오버플로
https://stackoverflow.com/questions/36288235/how-to-get-stable-results-with-tensorflow-setting-random-seed


 

예제코드를 실행하면 다음과 같은 출력이 나온다.

ThoraricSurgery.csv(application/haansoftcsv) - 21257 bytes, last modified: 2021. 6. 13. - 100% done
Saving ThoraricSurgery.csv to ThoraricSurgery.csv
Epoch 1/100
47/47 [==============================] - 1s 1ms/step - loss: 0.1485 - accuracy: 0.8426
Epoch 2/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1402 - accuracy: 0.8511
Epoch 3/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1433 - accuracy: 0.8489
Epoch 4/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1396 - accuracy: 0.8511
Epoch 5/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1386 - accuracy: 0.8468
Epoch 6/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1405 - accuracy: 0.8511
Epoch 7/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1337 - accuracy: 0.8489
Epoch 8/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1383 - accuracy: 0.8511
Epoch 9/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1380 - accuracy: 0.8511
Epoch 10/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1329 - accuracy: 0.8489
Epoch 11/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1351 - accuracy: 0.8511
Epoch 12/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1353 - accuracy: 0.8489
Epoch 13/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1349 - accuracy: 0.8511
Epoch 14/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1355 - accuracy: 0.8489
Epoch 15/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1389 - accuracy: 0.8489
Epoch 16/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1338 - accuracy: 0.8468
Epoch 17/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1449 - accuracy: 0.8511
Epoch 18/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1375 - accuracy: 0.8468
Epoch 19/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1379 - accuracy: 0.8511
Epoch 20/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1368 - accuracy: 0.8511
Epoch 21/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1370 - accuracy: 0.8511
Epoch 22/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1419 - accuracy: 0.8511
Epoch 23/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1387 - accuracy: 0.8489
Epoch 24/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1371 - accuracy: 0.8447
Epoch 25/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1422 - accuracy: 0.8511
Epoch 26/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1411 - accuracy: 0.8511
Epoch 27/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1405 - accuracy: 0.8511
Epoch 28/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1406 - accuracy: 0.8511
Epoch 29/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1384 - accuracy: 0.8511
Epoch 30/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1381 - accuracy: 0.8489
Epoch 31/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1336 - accuracy: 0.8489
Epoch 32/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1323 - accuracy: 0.8532
Epoch 33/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1328 - accuracy: 0.8489
Epoch 34/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1265 - accuracy: 0.8553
Epoch 35/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1422 - accuracy: 0.8468
Epoch 36/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1400 - accuracy: 0.8489
Epoch 37/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1404 - accuracy: 0.8468
Epoch 38/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1334 - accuracy: 0.8511
Epoch 39/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1332 - accuracy: 0.8532
Epoch 40/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1341 - accuracy: 0.8511
Epoch 41/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1382 - accuracy: 0.8468
Epoch 42/100
47/47 [==============================] - 0s 2ms/step - loss: 0.1291 - accuracy: 0.8511
Epoch 43/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1325 - accuracy: 0.8489
Epoch 44/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1344 - accuracy: 0.8383
Epoch 45/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1413 - accuracy: 0.8511
Epoch 46/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1394 - accuracy: 0.8511
Epoch 47/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1381 - accuracy: 0.8553
Epoch 48/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1358 - accuracy: 0.8511
Epoch 49/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1371 - accuracy: 0.8447
Epoch 50/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1293 - accuracy: 0.8468
Epoch 51/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1244 - accuracy: 0.8553
Epoch 52/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1335 - accuracy: 0.8489
Epoch 53/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1386 - accuracy: 0.8511
Epoch 54/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1353 - accuracy: 0.8511
Epoch 55/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1303 - accuracy: 0.8532
Epoch 56/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1279 - accuracy: 0.8574
Epoch 57/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1258 - accuracy: 0.8489
Epoch 58/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1380 - accuracy: 0.8468
Epoch 59/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1405 - accuracy: 0.8489
Epoch 60/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1343 - accuracy: 0.8532
Epoch 61/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1300 - accuracy: 0.8553
Epoch 62/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1265 - accuracy: 0.8489
Epoch 63/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1305 - accuracy: 0.8532
Epoch 64/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1238 - accuracy: 0.8553
Epoch 65/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1202 - accuracy: 0.8553
Epoch 66/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1306 - accuracy: 0.8447
Epoch 67/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1226 - accuracy: 0.8511
Epoch 68/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1224 - accuracy: 0.8553
Epoch 69/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1269 - accuracy: 0.8553
Epoch 70/100
47/47 [==============================] - 0s 2ms/step - loss: 0.1278 - accuracy: 0.8574
Epoch 71/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1266 - accuracy: 0.8489
Epoch 72/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1268 - accuracy: 0.8447
Epoch 73/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1364 - accuracy: 0.8532
Epoch 74/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1328 - accuracy: 0.8532
Epoch 75/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1325 - accuracy: 0.8489
Epoch 76/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1265 - accuracy: 0.8574
Epoch 77/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1321 - accuracy: 0.8553
Epoch 78/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1226 - accuracy: 0.8553
Epoch 79/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1214 - accuracy: 0.8553
Epoch 80/100
47/47 [==============================] - 0s 2ms/step - loss: 0.1218 - accuracy: 0.8511
Epoch 81/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1265 - accuracy: 0.8574
Epoch 82/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1262 - accuracy: 0.8532
Epoch 83/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1248 - accuracy: 0.8596
Epoch 84/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1309 - accuracy: 0.8426
Epoch 85/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1378 - accuracy: 0.8511
Epoch 86/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1351 - accuracy: 0.8511
Epoch 87/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1232 - accuracy: 0.8660
Epoch 88/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1281 - accuracy: 0.8532
Epoch 89/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1279 - accuracy: 0.8553
Epoch 90/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1327 - accuracy: 0.8532
Epoch 91/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1336 - accuracy: 0.8511
Epoch 92/100
47/47 [==============================] - 0s 998us/step - loss: 0.1220 - accuracy: 0.8617
Epoch 93/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1212 - accuracy: 0.8489
Epoch 94/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1241 - accuracy: 0.8532
Epoch 95/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1234 - accuracy: 0.8574
Epoch 96/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1323 - accuracy: 0.8511
Epoch 97/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1267 - accuracy: 0.8574
Epoch 98/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1237 - accuracy: 0.8574
Epoch 99/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1289 - accuracy: 0.8574
Epoch 100/100
47/47 [==============================] - 0s 1ms/step - loss: 0.1306 - accuracy: 0.8553
<tensorflow.python.keras.callbacks.History at 0x7f0190643d90
반응형