728x90
TensorFlow / Keras
목표 : 당뇨병 데이터로 분류 모델을 작성 - train / test 및 시각화 포함
tf.keras 란?
Keras는 딥 러닝 모델을 빌드하고 학습시키기 위한 TensorFlow의 상위 수준 API
application 이름은 keras 로 만들어서 django 프로젝트를 생성한다.
프로젝트 생성 / 세팅 방법은 이전 포스팅에 자세히 설명되어 있다.
파일명 : urls.py
from django.contrib import admin
from django.urls import path
from django.urls.conf import include
from keras import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.MainFunc),
path('keras/',include('keras.urls')),
]
어플리케이션의 urls들을 따로 관리해주기 위해 keras 안에 urls.py를 하나 더 만들어서 include로 이어준다.
파일명 : keras / urls.py
from django.urls import path
from keras import views
urlpatterns = [
path('keras', views.KerasView),
]
파일명 : views.py
from django.shortcuts import render
from django.http import request
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
plt.rc('font',family='malgun gothic') # 한글처리
plt.rcParams['axes.unicode_minus'] = False
# Create your views here.
def MainFunc(request):
return render(request, 'main.html')
main.html 을 반환하는 함수 MainFunc 를 생성한다.
def Analysis():
df = pd.read_csv('django_tensorflow_diabetes/keras/templates/diabetes.csv')
# print(df.head(3))
# print(df.info())
# print(df.iloc[:,8].unique()) # 중복빼고 종류 뭐뭐있는지만 뽑아보기
dataset = df.values
x = dataset[:,0:8]
y=dataset[:,-1]
#-----------------------------------train / test----------------------------------
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=12)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
# ----------------------------1. Sequential API 사용 -----------------------------
model = Sequential()
model.add(Dense(64, input_dim=8, activation='relu')) # 노드 64개 units=64
model.add(tf.keras.layers.BatchNormalization())
model.add(Dense(16, activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(Dense(8, activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(Dense(1, activation='sigmoid')) # sigmoid로 마지막엔 0이나 1
#print(model.summary())
# 모델이 사용할 옵티마이저와 손실 함수를 설정=> binary_crossentropy 손실 함수를 사용
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
loss, acc = model.evaluate(x_train, y_train, verbose=0)
early_stop = EarlyStopping(monitor='loss', patience=5)
# 모델의 손실과 정확도를 모니터링
history = model.fit(x_train, y_train, epochs=1000, batch_size=64,\
callbacks = [early_stop], verbose=0)
# batch_size : 모델을 64개의 샘플로 이루어진 미니배치(mini-batch)에서
# epochs : x_train과 y_train 텐서에 있는 모든 샘플에 대해 1000번 반복한다는 뜻
# -------------모델 학습이 끝나면 모델을 저장 한 후 저장된 모델을 사용한다.------------
#model.save('test.hdf5')
#from tensorflow.keras.models import load_model
#model2 = load_model('test.hdf5')
#print('loss : ', loss)
#print('acc : ', acc)
loss, acc = model.evaluate(x_test, y_test, batch_size=64)
# ------------------------------ 2. function API 사용------------------------------
inputs = Input(shape=(8,))
outputs1 = Dense(64, activation='relu')(inputs)
outputs2 = Dense(16, activation='relu')(outputs1)
outputs3 = Dense(8, activation='relu')(outputs2)
outputs4 = Dense(1, activation='sigmoid')(outputs3)
model2 = Model(inputs, outputs4)
model2.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
loss2, acc2 = model2.evaluate(x_train, y_train, verbose=0)
early_stop2 = EarlyStopping(monitor='loss', patience=5)
history2 = model2.fit(x_train, y_train, epochs=1000, batch_size=64,\
callbacks = [early_stop], verbose=0)
loss2, acc2 = model2.evaluate(x_test, y_test, batch_size=64)
return loss, acc, df, history, loss2, acc2, history2
Sequential 와 function 두가지 API 를 사용해서 모델을 작성해보았다.
층 설정
신경망의 기본 구성 요소는 층(layer)이다. 층은 주입된 데이터에서 표현을 추출한다.
대부분 딥러닝은 간단한 층을 연결하여 구성된다. tf.keras.layers.Dense와 같은 층들의 가중치(parameter)는 훈련하는 동안 학습된다.
모델 컴파일
- 손실 함수(Loss function)-훈련 하는 동안 모델의 오차를 측정. 모델의 학습이 올바른 방향으로 향하도록 이 함수를 최소화
- 옵티마이저(Optimizer)-데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정
- 지표(Metrics)-훈련 단계와 테스트 단계를 모니터링하기 위해 사용. metrics=['accuracy'] => 정확도를 사용
시각화 함수 정의
def KerasView(request):
result_loss, result_acc, df, history, loss2, acc2, history2 = Analysis()
#print('loss : ', loss)
#print('acc : ', acc)
# 1. loss 시각화 - Sequential API
loss = history.history['loss']
acc = history.history['accuracy']
print('loss1 : ', loss, len(loss))
print('accuracy1 : ', acc, len(acc))
plt.subplot(2, 1, 1) # 위쪽 그래프
epoch_len = np.arange(len(acc))
plt.plot(epoch_len, loss, c='red', label='loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend(loc='best') # 가장 적절한 지점에 표시한다
plt.subplot(2, 1, 2) # 아래쪽 그래프 (두개 한번에 출력)
plt.plot(epoch_len, acc, c='blue', label='acc')
plt.xlabel('epochs') # x축 제목
plt.ylabel('acc') # y축 제목
plt.legend(loc='best')
fig = plt.gcf()
fig.savefig('django_tensorflow_diabetes/keras/static/images/1_sa.png') # 이미지 저장
plt.close(fig) # 자원반납
# 2. loss 시각화
loss2 = history2.history['loss']
acc2 = history2.history['accuracy']
print('loss2 : ', loss2, len(loss2))
print('accuracy2 : ', acc2, len(acc2))
plt.subplot(2, 1, 1) # 위쪽 그래프
epoch_len2 = np.arange(len(acc2))
plt.plot(epoch_len2, loss2, c='red', label='loss')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.legend(loc='best')
plt.subplot(2, 1, 2) # 아래쪽 그래프 (두개 한번에 출력)
plt.plot(epoch_len2, acc2, c='blue', label='acc')
plt.xlabel('epochs')
plt.ylabel('acc')
plt.legend(loc='best')
fig = plt.gcf()
fig.savefig('django_tensorflow_diabetes/keras/static/images/2_fa.png')
plt.close(fig)
return render(request, 'keras.html', {'loss':result_loss, 'acc':result_acc})
파일명 : templates / main.html
...
</head>
<body>
<a href="/">메인 화면</a><br>
<h2>*loss와 acc에 대한 시각화*</h2>
모델 작성 1. Sequential API<br>
<img alt="" src="/static/images/1_sa.png" width="300">
<hr>
모델 작성 2. Function API<br>
<img alt="" src="/static/images/2_fa.png" width="300">
<hr>
최소 손실값 : {{loss}}, 분류 정확도:{{acc}}
</body>
</html>
파일명 : templates / keras.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
[ 당뇨 판정을 위한 분류 하기]<p/>
<a href="/keras/keras">결과 보기</a>
</body>
</html>
결과 화면
필요시 데이터를 입력받아서 예측하는 방식으로 확장해볼 수 있다.
참고
www.tensorflow.org/tutorials/keras/classification
www.tensorflow.org/tutorials/keras/text_classification
728x90
'Programming > Django' 카테고리의 다른 글
Django / Session 세션 저장 (2) | 2021.03.11 |
---|
댓글