Computer Science/DL, ML

PyQt5 GUI로 딥러닝(Deep Learning) 모델을 동작시키는 간단한 예제

TwinParadox 2020. 4. 18. 14:02
728x90

딥 러닝 모델을 개발하는 것은 매우 어려운 작업이다. 그냥 그걸 만드는 것에만 그치는 건 아쉽고, UI를 통해 모델을 출력 결과를 App으로 보여주게 구현해보는 것도 괜찮다. 모델은 Keras로 구현하였고 선형 회귀(Linear Regression) 모델로 구성했다. 그냥 거창한 거 넣을 것 없이 X1, X2, X3를 통해 Y를 예측하는 모델이며, target value는 다음 식으로 계산했다.

 

Y = X1 + X2 - X3

 

학습 데이터는 난수를 통해서 생성했고 5000개의 샘플로 생성해서 학습시켰다.

 

데이터 생성
import numpy as np
import pandas as pd


X1 = np.random.randint(1, 1000, size = 5000)
X2 = np.random.randint(1, 1000, size = 5000)
X3 = np.random.randint(1, 1000, size = 5000)
Y = X1 + X2 - X3

df = pd.DataFrame(np.array([X1, X2, X3, Y]).T, columns=['X1', 'X2', 'X3', 'Y'])
print(df)
df.to_csv('data.csv', index=False)

 

학습
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.models import load_model

from sklearn.model_selection import train_test_split

def train(data):
    X=data.drop('Y',axis=1)
    Y=data['Y']

    X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y,
                                                                    test_size=0.2)

    model = Sequential()
    model.add(Dense(30, input_dim=3, activation='relu'))
    model.add(Dense(6, activation='relu'))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.summary()
    history=model.fit(X_train, Y_train, validation_data=(X_validation, Y_validation)
                      ,epochs=200, batch_size=100)

    train_loss = history.history['loss']
    val_loss = history.history['val_loss']

    x_epochs = range(1, len(train_loss) + 1)

    plt.plot(x_epochs, train_loss, 'b', label='Training loss')
    plt.plot(x_epochs, val_loss, 'r', label='Validation loss')
    plt.title('Loss')
    plt.legend()
    plt.show()

    model.save('model.h5')

if __name__ == "__main__":
    df = pd.read_csv('data.csv', engine='c')
    train(df)
    

 

PyQt5를 사용해서 간단하게 GUI Application을 작성했다.

PyQt5를 사용할 때는 pyqt5-tools 패키지를 같이 설치해서, Qt Designer를 사용하여 UI를 디자인하는 것이 편하다. 단, 이런 경우에는 호환성 문제로 Spyder가 정상적으로 동작하지 않는 경우가 있다. Spyder를 사용하고 싶으면(2020년 4월 기준), PyQt5와 pyqt5-tools의 버전을 5.12.x 이하 버전으로 설치해야 한다.

 

 

구현 결과

20+20-20 = 20인데, 예측값도 잘 나온 편이다.

 

프로그램 전체적으로 흐름을 보면, 프로그램 실행하고서 Predict 버튼을 누르면 미리 h5로 저장해뒀던 Keras 모델을 불러와서 예측값을 뽑아내 마지막에 예측값을 출력하는 방식으로 구현했다. 보여주는 용도라면 이정도로 충분하겠지만, 라이브 서비스로 고객에게 제공하고, 모델의 구조나 weight가 노출되지 않게 하려면 PyQt5를 이용하는 것은 한계가 있으니 다른 방법을 찾아봐야 한다.

728x90
728x90