본문 바로가기
Programming/Django

Django / TensorFlow / Keras 개념 / 이항 분류 모델 작성

by with chu 2021. 3. 24.
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

댓글