Study/class note

딥러닝 / CNN구현

chanzae 2022. 4. 18. 17:44

8  CNN구현하기 - p.250

# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense,Conv2D,MaxPooling2D, Flatten,BatchNormalization  # 완전 연결계층, 합성곱층, pooling층, Flatten, 배치
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping

tf.random.set_seed(777)

(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # mnist 데이터 로드

x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# print(x_train.shape, x_test.shape)   #(60000, 28, 28, 1) (10000, 28, 28, 1)

# 2. 정규화 진행  
x_train = x_train / 255 
x_test = x_test / 255

# 3. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(100, kernel_size=(5,5), input_shape=(28,28,1), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
model.add(Flatten())  # 완전연결계층에 들어갈 수 있도록 이미지(피처맵)를 1차원으로 변경해야함
model.add(Dense(50, activation = 'sigmoid', input_shape = (784, )))  # 1층
model.add(BatchNormalization())
model.add(Dense(50, activation = 'sigmoid') ) # 2층 은닉층 
model.add(BatchNormalization())
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='SGD', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# 6. 모델을 훈련시킵니다. 

# callbacks = [EarlyStopping(monitor = 'val_acc',patience = 4, verbose = 1)]
history = model.fit(x_train, y_train, 
                         epochs = 30,  # 30에폭
                         batch_size = 100,
                         validation_data=(x_test, y_test) )

# 7. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

train_acc_list=history.history['acc']
train_acc_list

test_acc_list=history.history['val_acc']
test_acc_list

          
# 8. 시각화
import  matplotlib.pyplot  as  plt

x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()

600/600 [==============================] - 7s 11ms/step - loss: 0.0042 - acc: 0.9999 - val_loss: 0.0333 - val_acc: 0.9897

313/313 [==============================] - 2s 5ms/step - loss: 0.0333 - acc: 0.9897

 

훈련데이터와 테스트데이터의 정확도가 99%를 보이고 있고 오버피팅도 발생하지 않고 있음.

지난번 fashion_mnist 데이터로 완전 연결계층을 구성했을 때 정확도가 겨우 90%를 넘겼음.

이제 cnn을 사용해보겠음.

 

 

문제189. 위의 배치정규화까지 추가한 코드에 입력 데이터를 mnist가 fashion_mnist로 변경하시오.

필기체 mnist는 훈련데이터 (60000,1,28,28), 테스트데이터 (10000,1,28,28)

fashion mnist는 훈련데이터 (50000,1,28,28), 테스트데이터 (10000,1,28,28)

 

fashion_mnist 불러오는 코드:

from tensorflow.keras.datasets.fashion_mnist import load_data

(x_train, y_train), (x_test, y_test) = load_data()  # fashion_mnist 데이터
# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
# from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.datasets.fashion_mnist import load_data  #패션mnist
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense,Conv2D,MaxPooling2D, Flatten,BatchNormalization  # 완전 연결계층, 합성곱층, pooling층, Flatten, 배치
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping

tf.random.set_seed(777)

# (x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # 필기체 mnist 데이터 로드
(x_train, y_train), (x_test, y_test) = load_data()  # fashion_mnist 데이터


x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# print(x_train.shape, x_test.shape)   #(60000, 28, 28, 1) (10000, 28, 28, 1)

# 2. 정규화 진행  
x_train = x_train / 255 
x_test = x_test / 255

# 3. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(100, kernel_size=(5,5), input_shape=(28,28,1), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
model.add(Flatten())  # 완전연결계층에 들어갈 수 있도록 이미지(피처맵)를 1차원으로 변경해야함
model.add(Dense(50, activation = 'sigmoid', input_shape = (784, )))  # 1층
model.add(BatchNormalization())
model.add(Dense(50, activation = 'sigmoid') ) # 2층 은닉층 
model.add(BatchNormalization())
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='SGD', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# 6. 모델을 훈련시킵니다. 

# callbacks = [EarlyStopping(monitor = 'val_acc',patience = 4, verbose = 1)]
history = model.fit(x_train, y_train, 
                         epochs = 30,  # 30에폭
                         batch_size = 100,
                         validation_data=(x_test, y_test) )

# 7. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

train_acc_list=history.history['acc']
train_acc_list

test_acc_list=history.history['val_acc']
test_acc_list

          
# 8. 시각화
import  matplotlib.pyplot  as  plt

x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()

600/600 [==============================] - 7s 11ms/step - loss: 0.0640 - acc: 0.9784 - val_loss: 0.3211 - val_acc: 0.9087

313/313 [==============================] - 2s 6ms/step - loss: 0.3211 - acc: 0.9087

정확도는 높게 나오는 편이지만 오버피팅 발생.

 

 

문제190. 드롭아웃 층을 넣어서 오버피팅을 줄이시오.

# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
# from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.datasets.fashion_mnist import load_data
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, BatchNormalization, Dropout  # 완전 연결계층, 합성곱층, pooling층, Flatten, 배치
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping

tf.random.set_seed(777)

# (x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # 필기체 mnist 데이터 로드
(x_train, y_train), (x_test, y_test) = load_data()  # fashion_mnist 데이터


x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# print(x_train.shape, x_test.shape)   #(60000, 28, 28, 1) (10000, 28, 28, 1)

# 2. 정규화 진행  
x_train = x_train / 255 
x_test = x_test / 255

# 3. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(100, kernel_size=(5,5), input_shape=(28,28,1), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
model.add(Flatten())  # 완전연결계층에 들어갈 수 있도록 이미지(피처맵)를 1차원으로 변경해야함
model.add(Dense(50, activation = 'sigmoid', input_shape = (784, )))  # 1층
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(50, activation = 'sigmoid') ) # 2층 은닉층 
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='SGD', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# 6. 모델을 훈련시킵니다. 

# callbacks = [EarlyStopping(monitor = 'val_acc',patience = 4, verbose = 1)]
history = model.fit(x_train, y_train, 
                         epochs = 30,  # 30에폭
                         batch_size = 100,
                         validation_data=(x_test, y_test) )

# 7. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

train_acc_list=history.history['acc']
train_acc_list

test_acc_list=history.history['val_acc']
test_acc_list

          
# 8. 시각화
import  matplotlib.pyplot  as  plt

x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()

600/600 [==============================] - 7s 12ms/step - loss: 0.1088 - acc: 0.9621 - val_loss: 0.2956 - val_acc: 0.9097

313/313 [==============================] - 2s 5ms/step - loss: 0.2956 - acc: 0.9097

여전히 오버피팅 발생

 

 

문제191. 위의 경사하강법을 Adam으로 변경하고 활성화 함수를 relu로 변경하시오.

# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
# from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.datasets.fashion_mnist import load_data
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, BatchNormalization, Dropout  # 완전 연결계층, 합성곱층, pooling층, Flatten, 배치
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping

tf.random.set_seed(777)

# (x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # 필기체 mnist 데이터 로드
(x_train, y_train), (x_test, y_test) = load_data()  # fashion_mnist 데이터


x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# print(x_train.shape, x_test.shape)   #(60000, 28, 28, 1) (10000, 28, 28, 1)

# 2. 정규화 진행  
x_train = x_train / 255 
x_test = x_test / 255

# 3. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(100, kernel_size=(5,5), input_shape=(28,28,1), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
model.add(Flatten())  # 완전연결계층에 들어갈 수 있도록 이미지(피처맵)를 1차원으로 변경해야함
model.add(Dense(50, activation = 'relu', input_shape = (784, )))  # 1층
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(50, activation = 'relu') ) # 2층 은닉층 
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='Adam', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# 6. 모델을 훈련시킵니다. 

# callbacks = [EarlyStopping(monitor = 'val_acc',patience = 4, verbose = 1)]
history = model.fit(x_train, y_train, 
                         epochs = 30,  # 30에폭
                         batch_size = 100,
                         validation_data=(x_test, y_test) )

# 7. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

train_acc_list=history.history['acc']
train_acc_list

test_acc_list=history.history['val_acc']
test_acc_list

          
# 8. 시각화
import  matplotlib.pyplot  as  plt

x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()

600/600 [==============================] - 7s 12ms/step - loss: 0.0528 - acc: 0.9806 - val_loss: 0.4164 - val_acc: 0.9111

313/313 [==============================] - 2s 5ms/step - loss: 0.4164 - acc: 0.9111

여전히 오버피팅

훈련 데이터의 정확도는 96에서 98로 올라갔고 테스트도 90에서 91로 올라갔음. 하지만 아직도 오버피팅이 발생함.

 

문제192. 드롭아웃 비율을 0.2에서 0.3으로 올리고 실험하시오.

# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
# from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.datasets.fashion_mnist import load_data
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, BatchNormalization, Dropout  # 완전 연결계층, 합성곱층, pooling층, Flatten, 배치
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping

tf.random.set_seed(777)

# (x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # 필기체 mnist 데이터 로드
(x_train, y_train), (x_test, y_test) = load_data()  # fashion_mnist 데이터


x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# print(x_train.shape, x_test.shape)   #(60000, 28, 28, 1) (10000, 28, 28, 1)

# 2. 정규화 진행  
x_train = x_train / 255 
x_test = x_test / 255

# 3. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(100, kernel_size=(5,5), input_shape=(28,28,1), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
model.add(Flatten())  # 완전연결계층에 들어갈 수 있도록 이미지(피처맵)를 1차원으로 변경해야함
model.add(Dense(50, activation = 'relu', input_shape = (784, )))  # 1층
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(50, activation = 'relu') ) # 2층 은닉층 
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='Adam', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# 6. 모델을 훈련시킵니다. 

# callbacks = [EarlyStopping(monitor = 'val_acc',patience = 4, verbose = 1)]
history = model.fit(x_train, y_train, 
                         epochs = 30,  # 30에폭
                         batch_size = 100,
                         validation_data=(x_test, y_test) )

# 7. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

train_acc_list=history.history['acc']
test_acc_list=history.history['val_acc']


          
# 8. 시각화
import  matplotlib.pyplot  as  plt

x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()

 

문제193. 배치정규화와 드롭아웃을 CNN층에도 추가시키시오.

# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
# from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.datasets.fashion_mnist import load_data
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, BatchNormalization, Dropout  # 완전 연결계층, 합성곱층, pooling층, Flatten, 배치
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping

tf.random.set_seed(777)

# (x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # 필기체 mnist 데이터 로드
(x_train, y_train), (x_test, y_test) = load_data()  # fashion_mnist 데이터


x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# print(x_train.shape, x_test.shape)   #(60000, 28, 28, 1) (10000, 28, 28, 1)

# 2. 정규화 진행  
x_train = x_train / 255 
x_test = x_test / 255

# 3. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(100, kernel_size=(5,5), input_shape=(28,28,1), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
model.add(Dropout(0.3))

model.add(Flatten())  # 완전연결계층에 들어갈 수 있도록 이미지(피처맵)를 1차원으로 변경해야함
model.add(Dense(50, activation = 'relu', input_shape = (784, )))  # 1층
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(50, activation = 'relu') ) # 2층 은닉층 
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='Adam', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# 6. 모델을 훈련시킵니다. 

# callbacks = [EarlyStopping(monitor = 'val_acc',patience = 4, verbose = 1)]
history = model.fit(x_train, y_train, 
                         epochs = 30,  # 30에폭
                         batch_size = 100,
                         validation_data=(x_test, y_test) )

# 7. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

train_acc_list=history.history['acc']
test_acc_list=history.history['val_acc']


          
# 8. 시각화
import  matplotlib.pyplot  as  plt

x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()

600/600 [==============================] - 9s 15ms/step - loss: 0.1058 - acc: 0.9616 - val_loss: 0.2840 - val_acc: 0.9189

313/313 [==============================] - 2s 5ms/step - loss: 0.2840 - acc: 0.9189

 

문제194. 합성곱층을 하나 더 추가해서 돌리시오.

# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
# from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.datasets.fashion_mnist import load_data
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, BatchNormalization, Dropout  # 완전 연결계층, 합성곱층, pooling층, Flatten, 배치
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping

tf.random.set_seed(777)

# (x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # 필기체 mnist 데이터 로드
(x_train, y_train), (x_test, y_test) = load_data()  # fashion_mnist 데이터


x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
# print(x_train.shape, x_test.shape)   #(60000, 28, 28, 1) (10000, 28, 28, 1)

# 2. 정규화 진행  
x_train = x_train / 255 
x_test = x_test / 255

# 3. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(100, kernel_size=(5,5), input_shape=(28,28,1), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(BatchNormalization())
# model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
# model.add(Dropout(0.3))

model.add(Conv2D(100, kernel_size=(5,5), padding='same', activation='relu') )  # 흑백색조(,,1)
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size = (2,2), padding = 'same'))  #이미지를 선명하게 해주는 층
model.add(Dropout(0.3))

model.add(Flatten())  # 완전연결계층에 들어갈 수 있도록 이미지(피처맵)를 1차원으로 변경해야함
model.add(Dense(50, activation = 'relu', input_shape = (784, )))  # 1층
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(50, activation = 'relu') ) # 2층 은닉층 
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='Adam', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# 6. 모델을 훈련시킵니다. 
history = model.fit(x_train, y_train, 
                         epochs = 30,  # 30에폭
                         batch_size = 100,
                         validation_data=(x_test, y_test) )

# 7. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

train_acc_list=history.history['acc']
test_acc_list=history.history['val_acc']


          
# 8. 시각화
import  matplotlib.pyplot  as  plt

x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()
Epoch 30/30
600/600 [==============================] - 22s 36ms/step - loss: 0.0473 - acc: 0.9835 - val_loss: 0.2916 - val_acc: 0.9315
313/313 [==============================] - 3s 8ms/step - loss: 0.2916 - acc: 0.9315
 

반응형