🐼 참고한 책
백견불여일타 딥러닝 입문 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
🗒️ 정리
머신러닝
- 문제 정의 및 데이터 준비 -> 학습 -> 추론 및 평가
문제 정의 및 데이터 준비 : 명확한 문제 정의와 데이터 전처리가 중요
학습 : 모델 선택하고 학습, 하이퍼파라미터 실험 환경 등을 고려하여 학습시간을 효율적으로 활용할 수 있도록 함
추론 및 평가 : 올바른 지표를 통해 모델의 성능을 신뢰할 수 있어야 함- 구글 데이터셋 검색 & 캐글 : 데이터셋을 탐색하고 수집하기 좋음
- 이외 공공 데이터 포털, 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
# 컬럼명으로 접근 불가한 경우
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()