⚒️ 딥러닝 - 신경망 모델 🛠️

parkeu·2022년 9월 28일
0

ABC부트캠프

목록 보기
34/55

🐼 참고한 책

백견불여일타 딥러닝 입문 with 텐서플로우 2.x

input_shape : feature와 맞춰주기
y'과 y 손실함수 -> 손실점수 mse로 계산 : (y'-y)^2 -> 옵티마이저가 layer들에 전달

활성화 함수

ReLU 활성화 함수

  • 비선형 활성화 함수

  • 선형 활성화 함수를 쓰면 f(f(f(x))) -> f(x)와 동일하여 층을 쌓는 이유가 없어짐 -> 비선형 활성화 함수 사용으로 해결

  • 대표적으로 사용되는 시그모이드(Sigmoid), 하이퍼볼릭 탄젠트(tanh), ReLU 활성화 함수

경사 하강법

  • 특정 함수에서의 미분을 통해 얻은 기울기를 활용하여 최적의 값을 찾아가는 방법
  • 학습률(lr)은 성능, 학습 속도에 중요한 영향을 끼치는 하이퍼파라미터
    - 학습률이 너무 높으면 학습이 되지 않을 수 있음
    - 학습률이 너무 낮으면 최적값에 도달하기 전에 학습 종료
    - 주로 1e-3(0.001)을 기본값으로 사용
    - 손실함수 값이 계속 높아지면 ? 학습이 안됐다는 말
  • 어느 지점에서 출발해도 경사를 따라가다 보면 최적값(손실이 최소가 되는 지점)에 도달함
  • 경사하강법은 항상 최적값을 반환한다는 보장 x

신경망 학습 최적화(Optimization)

  • 하이퍼파라미터를 어떻게 설정하느냐에 따라 학습의 결과가 천차만별로 달라짐
  • 신경망 모델의 학습과 그 결과에 따른 손실 함수의 값을 최소화하는 방향으로 하이퍼파라미터의 값을 찾는 것이 최적화의 목표
  • 최적의 가중치 값을 구하기위해 앞에서는 미분을 통해 기울기를 구하여 가중치 값을 갱신하는 방법인 확률적 경사하강법(SGD) 방법
  • 이외에도 다양한 최적화 기법을 통해 최적의 하이퍼파라미터 조합 찾을 수 있음

    출처: 하용호, 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다

케라스에서의 개발 과정

  1. 학습 데이터 정의
  2. 데이터에 적합한 모델 정의
  3. 손실함수, 옵티마이저, 평가지표를 선택하여 학습 과정 설정
  4. 모델 학습
  5. 모델 평가

🗒️ 정리

머신러닝

  • 문제 정의 및 데이터 준비 -> 학습 -> 추론 및 평가
    문제 정의 및 데이터 준비 : 명확한 문제 정의와 데이터 전처리가 중요
    학습 : 모델 선택하고 학습, 하이퍼파라미터 실험 환경 등을 고려하여 학습시간을 효율적으로 활용할 수 있도록 함
    추론 및 평가 : 올바른 지표를 통해 모델의 성능을 신뢰할 수 있어야 함
  • 구글 데이터셋 검색 & 캐글 : 데이터셋을 탐색하고 수집하기 좋음
  • 이외 공공 데이터 포털, AI Hub 등
  • 다양한 커뮤니티 통해 문제 해결 가능

딥러닝

  • 퍼셉트론 알고리즘부터 시작
  • 다중 퍼셉트론을 사용하여 XOR 게이트 문제 해결 가능
  • 대표적 손실 함수 ['mse','binary_crossentropy', 'categorical_crossentropy'],
  • 옵티마이저 ['sgd','rmsprop','adam'] 문자열로 지정하여 사용가능

🗃️ 다층 퍼셉트론 모델 만들기

🏥 피마족 당뇨병 발병 유무 예측

문제 정의

  • 이진 분류 예제에 적합한 데이터셋은 8개 변수와 당뇨병 발병 유무가 기록된 '피마족 인디언 발병 데이터셋'
  • 8개 변수를 독립변수로 보고 당뇨병 발병 유무를 예측하는 이진 분류 문제로 정의(결과로 1이면 당뇨병, 0이면 아님)

라이브러리임포트, 데이터 준비

https://www.kaggle.com/uciml/pima-indians-diabetes-database

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense

# 랜덤시드 고정
np.random.seed(5)

dataset = pd.read_csv('/content/diabetes.csv')


데이터 분리

# 데이터 분리
X = dataset[['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
             'BMI', 'DiabetesPedigreeFunction', 'Age']]
y = dataset['Outcome']
# train:test -> 80:20 -> 614:154
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=777)

모델 구성하기

model = Sequential()
model.add(Dense(32, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 모델 확인
model.summary()

구성한 모델 그려보기

tf.keras.utils.plot_model(model, show_shapes=True, show_layer_names=True, rankdir='TB', expand_nested=False, dpi=100)

모델 설정, 학습하기

model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=1500, batch_size=128)

학습결과 그려보기

import matplotlib.pyplot as plt

his_dict = history.history
loss = his_dict['loss']

epochs = range(1, len(loss) + 1)
fig = plt.figure(figsize = (10, 5))

# 훈련 및 검증 손실 그리기
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(epochs, loss, color = 'orange', label = 'train_loss')
ax1.set_title('train loss')
ax1.set_xlabel('epochs')
ax1.set_ylabel('loss')
ax1.legend()

acc = his_dict['accuracy']

# 훈련 및 검증 정확도 그리기
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(epochs, acc, color = 'blue', label = 'train_accuracy')
ax2.set_title('train accuracy')
ax2.set_xlabel('epochs')
ax2.set_ylabel('accuracy')
ax2.legend()

plt.show()

모델 평가

scores = model.evaluate(X_test, y_test)
print('%s: %.2f%%' %(model.metrics_names[1], scores[1]*100))

scores = model.evaluate(X_train, y_train)
print('%s: %.2f%%' %(model.metrics_names[1], scores[1]*100))

👀 과대적합 상태 -> X 정규화해보기


정규화추가한 학습모델

👀 데이터 분리에서 이 코드만 추가하면 됨 !!!~!~!~~

  • 결과

  • 모델 평가

🏥 폐암 수술 환자의 생존유무 예측

🐼 준비

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
>
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
>
# 랜덤시드 고정
np.random.seed(5)

dataset = pd.read_csv('/content/ThoraricSurgery.csv', header=None)
dataset

데이터셋 분리하기 입력(feature 17), 출력(label, 1) 분리

# 컬럼명으로 접근 불가한 경우
X = dataset.iloc[:, :-1]
y = dataset.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1 , random_state=7)

모델 구성하기

model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.summary()

모델 설정, 학습하기

# 모델 설정
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 모델 학습
history = model.fit(X_train, y_train, epochs=100, batch_size=64) # 423(X.shape)/64 = 6.6...이므로 한번 공부할 때 7번(반올림)씩 나눠서 중간중간 가중치 업데이트

학습 결과 그려보기

import matplotlib.pyplot as plt

his_dict = history.history
loss = his_dict['loss']

epochs = range(1, len(loss) + 1)
fig = plt.figure(figsize = (10, 5))

# 훈련 및 검증 손실 그리기
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(epochs, loss, color = 'orange', label = 'train_loss')
ax1.set_title('train loss')
ax1.set_xlabel('epochs')
ax1.set_ylabel('loss')
ax1.legend()

acc = his_dict['accuracy']

# 훈련 및 검증 정확도 그리기
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(epochs, acc, color = 'blue', label = 'train_accuracy')
ax2.set_title('train accuracy')
ax2.set_xlabel('epochs')
ax2.set_ylabel('accuracy')
ax2.legend()

plt.show()

모델 평가하기


profile
배고파용.

0개의 댓글