
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]]

'✨ 딥러닝·머신러닝' 카테고리의 다른 글
| 사이킷런 - 지도학습으로 붓꽃의 품종을 판별 (0) | 2026.06.16 |
|---|---|
| 사이킷런 - 분류 알고리즘으로 붓꽃(iris)의 품종을 판별 (0) | 2026.06.15 |
| TensorFlow - 도커 컨테이너에서 텐서플로를 실행 (0) | 2026.06.15 |
| 신경망의 발견 - 신경망에서 단순 퍼셉트론, 다중 퍼셉트론, 딥러닝까지 (0) | 2026.06.15 |
| 합성곱 신경망(CNN) - 합성곱 신경망으로 MNIST 손글씨를 학습 (0) | 2026.06.13 |
댓글