KERAS - MNIST 소스 분석

2020. 3. 6. 15:21딥러닝

너무나도 흔하고 많이 봐왔던 입문 소스이지만, 강의도 참조하고 주석도 달아봄

 

 

1-1. 소스

# 0. 사용할 패키지 불러오기
from keras.utils import np_utils
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation

#1. 데이터셋 준비하기
#아마존에서 이미지 다운로드
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
# 하나의 데이터를 샘플이라고 하면
# 위의 변수들은 각각 60000x784, 60000x1, 10000x784, 10000x1의 크기로 각각이 1차원 배열로 되어 있다.
# 1) reshape을 해서 2차원 배열로 바꾸겠다.
# 2) 0~255의 정수값을 astype('float32')/255.0 으로 0~1사이의 값으로 바꾸겠다.(float32로 정규화)
#   사이즈는 더 커짐
#   딥러닝에 넣을 때, 정규화해서 넣어야 더 잘된다고 함
X_train = X_train.reshape(60000,784).astype('float32') / 255.0
X_test  = X_test.reshape(10000,784).astype('float32') / 255.0

# 라벨 값이 one-hot-encoding  으로 바뀜
# ex) 1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
#     7 -> [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
#     입력 1바치트 -> 출력 10바이트
Y_train = np_utils.to_categorical(Y_train)
Y_test  = np_utils.to_categorical(Y_test)

#2. 모델 구성하기
model = Sequential()
model.add(Dense(output_dim=64, input_dim=28*28, activation='relu'))
model.add(Dense(output_dim=10, activation='softmax'))
#소프트맥스 : 출력의 합이 1이다
'''
Categorical Cross Entropy
0.1    0
0.2    0
0.7    1 
'''

#3. 모델 엮기 : '네트워크가 학습할 준비가 되었습니다.'라는 의미
model.compile(loss='categorical_crossentropy', sgd='sgd', metrics=['accuracy'])

# batch_size : 몇문항 풀고 업데이트 할 거냐?
# ex) 문제가 100개고, batch_size가 10이면 10번의 업데이트
# epoch : 전제 문제를 반복 횟수
# 300000(training 갯수-60000 x epoch-5) / 32번 네트워크 갱신한다.
hist = model.fit(X_train,Y_train, nb_epoch=5, batch_size=32)

# 
# 데이터셋 : 훈련셋(모의고사 1~4회), 검증셋(5회), 시험셋(ex. 작년 시험문제) 
# 매 epoch마다 검증셋으로 검증한다.

 

1-2. 결과 (acc : 시험세트를 가지고 테스트한 정확률, loss : 시험세트로 테스트 한 loss)

더보기

#아래에서 acc (accuracy) : 시험셋으로 검사했을 때 정확률
60000/60000 [==============================] - 3s 57us/step - loss: 0.6694 - acc: 0.8300
Epoch 2/5
60000/60000 [==============================] - 3s 50us/step - loss: 0.3525 - acc: 0.9002
Epoch 3/5
60000/60000 [==============================] - 3s 48us/step - loss: 0.3068 - acc: 0.9135
Epoch 4/5
60000/60000 [==============================] - 3s 49us/step - loss: 0.2795 - acc: 0.9210
Epoch 5/5
60000/60000 [==============================] - 3s 49us/step - loss: 0.2590 - acc: 0.9261

 

2-1. 소스2

# 0. 사용할 패키지 불러오기
from keras.utils import np_utils
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation

# 1. 데이터셋 생성하기
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255.0
x_test = x_test.reshape(10000, 784).astype('float32') / 255.0
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

#validation set
x_val = x_train[50000:60000] # <- 추가
y_val = y_train[50000:60000] # <- 추가
#train set
x_train = x_train[0:50000] # <- 추가
y_train = y_train[0:50000] # <- 추가


# 2. 모델 구성하기
model = Sequential()
model.add(Dense(output_dim=64, input_dim=28*28, activation='relu'))
model.add(Dense(output_dim=10, activation='softmax'))

# 3. 모델 학습과정 설정하기
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# 4. 모델 학습시키기 : validation_data 추가
hist = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val))

# 5. 학습과정 살펴보기
print('## training loss and acc ##')
print(hist.history['loss'])
print(hist.history['acc'])

# 6. 모델 평가하기
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=32)
print('## evaluation loss and_metrics ##')
print(loss_and_metrics)

# 7. 모델 사용하기
xhat = x_test[0:1]
#yhat = model.predict(xhat)
yhat = model.predict_classes(xhat)
print('## yhat ##')
print(yhat)

 

2-2. 결과 (val acc : validation 데이터를 가지고 구한 정확률, val loss : validation 데이터를 가지고 구한 loss)

더보기

Train on 50000 samples, validate on 10000 samples Epoch 1/10 50000/50000 [==============================] - 3s 66us/step - loss: 0.7451 - acc: 0.8064 - val_loss: 0.3779 - val_acc: 0.9016 Epoch 2/10 50000/50000 [==============================] - 3s 62us/step - loss: 0.3706 - acc: 0.8962 - val_loss: 0.3054 - val_acc: 0.9168 Epoch 3/10 50000/50000 [==============================] - 3s 65us/step - loss: 0.3170 - acc: 0.9106 - val_loss: 0.2756 - val_acc: 0.9236 Epoch 4/10 50000/50000 [==============================] - 3s 61us/step - loss: 0.2870 - acc: 0.9194 - val_loss: 0.2537 - val_acc: 0.9298 Epoch 5/10 50000/50000 [==============================] - 3s 59us/step - loss: 0.2650 - acc: 0.9253 - val_loss: 0.2371 - val_acc: 0.9337 Epoch 6/10 50000/50000 [==============================] - 3s 59us/step - loss: 0.2472 - acc: 0.9305 - val_loss: 0.2244 - val_acc: 0.9373 Epoch 7/10 50000/50000 [==============================] - 3s 58us/step - loss: 0.2325 - acc: 0.9345 - val_loss: 0.2125 - val_acc: 0.9416 Epoch 8/10 50000/50000 [==============================] - 3s 58us/step - loss: 0.2195 - acc: 0.9382 - val_loss: 0.2031 - val_acc: 0.9441 Epoch 9/10 50000/50000 [==============================] - 3s 60us/step - loss: 0.2083 - acc: 0.9412 - val_loss: 0.1954 - val_acc: 0.9476 Epoch 10/10 50000/50000 [==============================] - 3s 58us/step - loss: 0.1984 - acc: 0.9437 - val_loss: 0.1858 - val_acc: 0.9496 ## training loss and acc ## [0.7451425078868866, 0.3705984930920601, 0.3170429726314545, 0.2870378151583672, 0.26498337667942046, 0.24718738529920578, 0.23247317880630494, 0.21945956731557847, 0.20832648242115975, 0.19844862290382384] [0.80636, 0.89624, 0.91064, 0.91936, 0.9253, 0.9305, 0.93448, 0.93816, 0.94124, 0.94368] 10000/10000 [==============================] - 0s 23us/step ## evaluation loss and_metrics ## [0.19293292177915572, 0.9454] ## yhat ## [7]

 

* 참조

1. 데이터세트

  1) 훈련 세트(training set)

  2) 검증 세트

  3) 시험 세트

 

 

'딥러닝' 카테고리의 다른 글

Octave 실습 정리 1  (0) 2021.03.15
Mnist 학습 후 c#으로 실행하기  (0) 2020.03.10
DCGAN 실습  (0) 2020.02.26
파이썬과 tensorflow 특정 버전으로 설치  (0) 2020.02.24
tensorflow 2.0 설치  (1) 2020.02.05