✨ 딥러닝·머신러닝

케라스(Keras) - 최소한의 코드로 딥러닝을 구현한다

Vento AI Lab 2026. 6. 15.
반응형

 

1. Keras 개요

Keras는 딥러닝 모델을 쉽게 구축하고 훈련할 수 있는 파이썬 기반의 오픈 소스 신경망 라이브러리다. Keras는 사용자 친화적인 인터페이스와 모듈성을 제공하여 신경망 모델을 빠르게 프로토타이핑하고 실험할 수 있도록 도와준다. Keras는 TensorFlow 2.0부터는 TensorFlow의 공식 API로 통합되어 개발되었다. TensorFlow 2.0에서는 tf.keras라는 이름으로 Keras를 사용할 수 있다. TensorFlow 상에서 tf.keras를 통해 Keras의 기능을 활용할 수 있다.

2. 딥러닝 프로세스

 

1) 데이터 준비

sckit-learn 라이브러리에서 제공하는 iris 데이터셋을 로딩한다.

# 데이터 준비
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()

데이터는 150개가 있고 4개의 항목으로 구성되어 있다. 3건의 데이터를 표시해 본다.

print(iris.data.shape)
print(iris.data[:3])
 
(150, 4)
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]]

target은 0, 1, 2의 결과를 갖고 있다.

print(iris.target)
 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

2) 데이터 전처리

데이터를 전처리한다. 입력 데이터를 평균값이 0으로 표준편차가 1이 되도록 표준화를 한다.

결과 데이터는 one-hot 표현으로 바꾼다.

# 데이터 전처리
from sklearn import preprocessing
from keras.utils import np_utils

# 입력 데이터
scaler = preprocessing.StandardScaler()
scaler.fit(iris.data)
x = scaler.transform(iris.data)
print(x[:3])

# 결과 데이터
y = np_utils.to_categorical(iris.target)
print(y[:3])

# 훈련 데이터와 테스트 데이터
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8)

입력 데이터 값이 표준화가 되었고 결과 데이터는 one-hot 표현으로 변하였다.

[[-0.90068117  1.01900435 -1.34022653 -1.3154443 ]
 [-1.14301691 -0.13197948 -1.34022653 -1.3154443 ]
 [-1.38535265  0.32841405 -1.39706395 -1.3154443 ]]
[[1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]]

 

3) 모델 생성

Sequential 클래스를 사용해 모델을 생성한다.

Dense 클래스로 전결합층을 만들고 Actication 클래스로 활성화 함수를 정의한다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation

# 모델 생성
model = Sequential()
model.add(Dense(32, input_dim=4))
model.add(Activation('relu'))
model.add(Dense(32))
model.add(Activation('relu'))
model.add(Dense(3))
model.add(Activation('softmax'))
 

 

4) 모델 요약

정의한 모델의 Summay 정보를 표시한다. 모델의 구조와 파라미터 개수를 알 수 있다.

# 모델 요약
print(model.summary())
 
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 dense (Dense)               (None, 32)                160
 activation (Activation)     (None, 32)                0
 dense_1 (Dense)             (None, 32)                1056
 activation_1 (Activation)   (None, 32)                0
 dense_2 (Dense)             (None, 3)                 99
 activation_2 (Activation)   (None, 3)                 0
=================================================================
Total params: 1,315
Trainable params: 1,315
Non-trainable params: 0
_________________________________________________________________
None

 

​5) 모델 컴파일

옵티마이저와 손실함수 그리고 평가지표를 지정하여 모델을 컴파일 한다.

# 모델 컴파일
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
 

 

​6) 모델 학습

훈련 데이터를 입력하고 반복 훈련할 에포크 수와 배치 크기를 지정하여 모델을 학습한다.

# 모델 학습
model.fit(x_train, y_train, epochs=30, batch_size=8)
Epoch 1/30
15/15 [==============================] - 1s 3ms/step - loss: 1.1085 - accuracy: 0.3917
Epoch 2/30
15/15 [==============================] - 0s 3ms/step - loss: 0.9794 - accuracy: 0.7083
Epoch 3/30
15/15 [==============================] - 0s 3ms/step - loss: 0.8836 - accuracy: 0.8333
Epoch 4/30
15/15 [==============================] - 0s 4ms/step - loss: 0.8099 - accuracy: 0.8500
Epoch 5/30
15/15 [==============================] - 0s 3ms/step - loss: 0.7462 - accuracy: 0.8500
Epoch 6/30
15/15 [==============================] - 0s 3ms/step - loss: 0.6890 - accuracy: 0.8500
Epoch 7/30
15/15 [==============================] - 0s 3ms/step - loss: 0.6381 - accuracy: 0.8667
Epoch 8/30
15/15 [==============================] - 0s 3ms/step - loss: 0.5937 - accuracy: 0.8500
Epoch 9/30
15/15 [==============================] - 0s 4ms/step - loss: 0.5547 - accuracy: 0.8583
Epoch 10/30
15/15 [==============================] - 0s 4ms/step - loss: 0.5208 - accuracy: 0.8583
Epoch 11/30
15/15 [==============================] - 0s 5ms/step - loss: 0.4897 - accuracy: 0.8667
Epoch 12/30
15/15 [==============================] - 0s 4ms/step - loss: 0.4629 - accuracy: 0.8667
Epoch 13/30
15/15 [==============================] - 0s 4ms/step - loss: 0.4398 - accuracy: 0.8667
Epoch 14/30
15/15 [==============================] - 0s 3ms/step - loss: 0.4194 - accuracy: 0.8667
Epoch 15/30
15/15 [==============================] - 0s 3ms/step - loss: 0.4007 - accuracy: 0.8750
Epoch 16/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3848 - accuracy: 0.8667
Epoch 17/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3708 - accuracy: 0.8833
Epoch 18/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3577 - accuracy: 0.8833
Epoch 19/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3455 - accuracy: 0.8833
Epoch 20/30
15/15 [==============================] - 0s 4ms/step - loss: 0.3347 - accuracy: 0.8833
Epoch 21/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3245 - accuracy: 0.8917
Epoch 22/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3166 - accuracy: 0.9000
Epoch 23/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3082 - accuracy: 0.8917
Epoch 24/30
15/15 [==============================] - 0s 3ms/step - loss: 0.2997 - accuracy: 0.9000
Epoch 25/30
15/15 [==============================] - 0s 3ms/step - loss: 0.2921 - accuracy: 0.9000
Epoch 26/30
15/15 [==============================] - 0s 4ms/step - loss: 0.2849 - accuracy: 0.9083
Epoch 27/30
15/15 [==============================] - 0s 4ms/step - loss: 0.2786 - accuracy: 0.9083
Epoch 28/30
15/15 [==============================] - 0s 4ms/step - loss: 0.2723 - accuracy: 0.9083
Epoch 29/30
15/15 [==============================] - 0s 4ms/step - loss: 0.2666 - accuracy: 0.9083
Epoch 30/30
15/15 [==============================] - 0s 4ms/step - loss: 0.2606 - accuracy: 0.9250
 

 

7) 모델 검증

검증한 결과로 모델에 대한 손실 값과 메트릭 값을 반환한다.

 
# 모델 검증
loss, accuracy = model.evaluate(x_test,  y_test)
print("loss:", loss, "accuracy:", accuracy)
1/1 [==============================] - 0s 411ms/step - loss: 0.2635 - accuracy: 0.9000
loss: 0.26350605487823486 accuracy: 0.8999999761581421

 

8) 모델 예측

학습이 완료된 모델에 검증 데이터를 넣으면 예측 값을 반환한다.

# 모델 예측
y_test = model.predict(x_test)
print(y_test[:3])
1/1 [==============================] - 0s 140ms/step
[[0.03075908 0.2543307  0.71491015]
 [0.04319241 0.3496902  0.6071173 ]
 [0.01143552 0.07090073 0.9176637 ]]
 

9) 모델 저장

학습한 모델을 저장할 수 있다.

# 모델 저장
from tensorflow.keras.models import load_model
model.save("model.h5")
 

 

3. 전체 코드

Keras를 사용하여 딥러닝 프로세스에 따라 구현한 전체 코드이다.

# 데이터 준비
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()

print(iris.data.shape)
print(iris.data[:3])
print(iris.target)

# 데이터 전처리
from sklearn import preprocessing
from keras.utils import np_utils

# 입력 데이터
scaler = preprocessing.StandardScaler()
scaler.fit(iris.data)
x = scaler.transform(iris.data)
print(x[:3])

# 결과 데이터
y = np_utils.to_categorical(iris.target)
print(y[:3])

# 훈련 데이터와 테스트 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation

# 모델 생성
model = Sequential()
model.add(Dense(32, input_dim=4))
model.add(Activation('relu'))
model.add(Dense(32))
model.add(Activation('relu'))
model.add(Dense(3))
model.add(Activation('softmax'))

# 모델 요약
print(model.summary())

# 모델 컴파일
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])

# 모델 학습
history = model.fit(x_train, y_train, epochs=30, batch_size=8)

# 모델 검증
loss, accuracy = model.evaluate(x_test,  y_test)
print("loss:", loss, "accuracy:", accuracy)

# 모델 예측
y_test = model.predict(x_test)
print(y_test[:3])

# 모델 저장
from tensorflow.keras.models import load_model
model.save("model.h5")
 

실행 결과

(150, 4)
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
[[-0.90068117  1.01900435 -1.34022653 -1.3154443 ] 
 [-1.14301691 -0.13197948 -1.34022653 -1.3154443 ] 
 [-1.38535265  0.32841405 -1.39706395 -1.3154443 ]]
[[1. 0. 0.] 
 [1. 0. 0.] 
 [1. 0. 0.]]
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 dense (Dense)               (None, 32)                160

 activation (Activation)     (None, 32)                0

 dense_1 (Dense)             (None, 32)                1056

 activation_1 (Activation)   (None, 32)                0

 dense_2 (Dense)             (None, 3)                 99

 activation_2 (Activation)   (None, 3)                 0

=================================================================
Total params: 1,315
Trainable params: 1,315
Non-trainable params: 0
_________________________________________________________________
None
Epoch 1/30
15/15 [==============================] - 1s 3ms/step - loss: 1.1042 - accuracy: 0.4833
Epoch 2/30
15/15 [==============================] - 0s 2ms/step - loss: 1.0210 - accuracy: 0.5250
Epoch 3/30
15/15 [==============================] - 0s 2ms/step - loss: 0.9522 - accuracy: 0.5750
Epoch 4/30
15/15 [==============================] - 0s 3ms/step - loss: 0.8944 - accuracy: 0.6667
Epoch 5/30
15/15 [==============================] - 0s 2ms/step - loss: 0.8431 - accuracy: 0.7250
Epoch 6/30
15/15 [==============================] - 0s 2ms/step - loss: 0.7970 - accuracy: 0.7833
Epoch 7/30
15/15 [==============================] - 0s 2ms/step - loss: 0.7519 - accuracy: 0.8250
Epoch 8/30
15/15 [==============================] - 0s 2ms/step - loss: 0.7089 - accuracy: 0.8333
Epoch 9/30
15/15 [==============================] - 0s 2ms/step - loss: 0.6674 - accuracy: 0.8333
Epoch 10/30
15/15 [==============================] - 0s 2ms/step - loss: 0.6270 - accuracy: 0.8333
Epoch 11/30
15/15 [==============================] - 0s 2ms/step - loss: 0.5904 - accuracy: 0.8333
Epoch 12/30
15/15 [==============================] - 0s 2ms/step - loss: 0.5559 - accuracy: 0.8417
Epoch 13/30
15/15 [==============================] - 0s 2ms/step - loss: 0.5252 - accuracy: 0.8500
Epoch 14/30
15/15 [==============================] - 0s 2ms/step - loss: 0.4973 - accuracy: 0.8500
Epoch 15/30
15/15 [==============================] - 0s 2ms/step - loss: 0.4721 - accuracy: 0.8583
Epoch 16/30
15/15 [==============================] - 0s 2ms/step - loss: 0.4508 - accuracy: 0.8583
Epoch 17/30
15/15 [==============================] - 0s 2ms/step - loss: 0.4323 - accuracy: 0.8667
Epoch 18/30
15/15 [==============================] - 0s 2ms/step - loss: 0.4142 - accuracy: 0.8750
Epoch 19/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3986 - accuracy: 0.8750
Epoch 20/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3845 - accuracy: 0.8917
Epoch 21/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3723 - accuracy: 0.8833
Epoch 22/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3599 - accuracy: 0.9000
Epoch 23/30
15/15 [==============================] - 0s 3ms/step - loss: 0.3488 - accuracy: 0.9000
Epoch 24/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3398 - accuracy: 0.9083
Epoch 25/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3300 - accuracy: 0.9000
Epoch 26/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3212 - accuracy: 0.9167
Epoch 27/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3138 - accuracy: 0.9083
Epoch 28/30
15/15 [==============================] - 0s 2ms/step - loss: 0.3067 - accuracy: 0.9083
Epoch 29/30
15/15 [==============================] - 0s 3ms/step - loss: 0.2993 - accuracy: 0.9167
Epoch 30/30
15/15 [==============================] - 0s 3ms/step - loss: 0.2918 - accuracy: 0.9083
1/1 [==============================] - 0s 369ms/step - loss: 0.3020 - accuracy: 0.8333
loss: 0.30200979113578796 accuracy: 0.8333333134651184
1/1 [==============================] - 0s 131ms/step
[[0.03723194 0.37316272 0.5896053 ]
 [0.9647244  0.02508524 0.01019025]
 [0.963655   0.02931585 0.00702921]]

 

 

반응형

댓글