본문 바로가기

머신러닝공부

CIFAR-10을 이용한 CNN 성능 향상 과정 예제 스크립트

728x90
반응형

데이터 로드 및 정규화 -> 데이터 증강 -> 모델 구축(중첩 CNN모델) -> 모델 컴파일 및 학습 -> 성능향상 측정

[1] CIFAR-10 데이터 불러오기 및 정규화

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprosessing.image import ImageDataGenerator

(x_train, y_train), (x_test, y_test) = cifar10.load_data() # 데이터 불러오기

x_train = x_train.astype(np.float32)/255.0 # 정규화
x_test = x_test.astype(np.float32)/255.0 # 정규화

print(x_train.shape, x_test.shape)
print(y_train.shape, y_test.shape)

[2] CIFAR 10 데이터 보강(150%증대)

gen = ImageDataGenerator(rotation_ragne=20, shear_range=0.2, width_shift_ragne=0.2, height_shift_range=0.2, horizontal_flip=True) # 보강할 데이터 변경 형식 설정
augment_ratio=1.5 # 전체 데이터의 150%
augment_size=int(augment_ratio * x_train.shape[0])

randidx = np.random.randint(x_train.shape[0], size=augment_size)
x_augmented=x_train[randidx].copy() # copy() 함수를 사용해 원본 데이터의 복사본을 만듦
y_augmented=y_train[randidx].copy() # copy() 함수를 사용해 원본 데이터의 복사본을 만듦

x_augmented, y_augmented = gen.flow(x_augmented, y_augmented, batch_size=augment_size, shuffle=false).next() # 보강할 이미지 데이터 생성
x_train = np.concatenate((x_train,x_augmented))
y_train = np.concatenate((y_train, y_augmented))

s = np.arragne(x_train.shape[0])
np.random.shuffle(s)

x_train = x_train[s] # 보강할 학습데이터, 정답데이터를 랜덤하게 섞음
y_train = y_train[s] # 보강할 학습데이터, 정답데이터를 랜덤하게 섞음

[3] CNN 모델 구축

cnn=Sequential()

# Block 1
cnn.add(conv2D(32, (3, 3), activation='relu', padding='same', input_shape(32, 32, 3))) # cifar10텐서 (높이, 너비, 채널)
cnn.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
cnn.add(MaxPooling2D(pool_size=(2,2))
cnn.add(Dropout(0.25))

# Block 2
cnn.add(Conv2D(64, (3, 3), activation='relu', padding'same')
cnn.add(Conv2D(64, (3, 3), activation='relu', padding'same')
cnn.add(MaxPooling2D(pool_size(2, 2))
cnn.add(Dropout(0.25))

# Block 3
cnn.add(Conv2D(128, (3, 3), activation='relu', padding'same')
cnn.add(MaxPooling2D(pool_size(2, 2))
cnn.add(Dropout(0.25))
cnn.add(Conv2D(128, (3, 3), activation='relu', padding'same')
cnn.add(Dropout(0.25))
cnn.add(Conv2D(256, (3, 3), activation='relu', padding'same')
cnn.add(MaxPooling2D(pool_size(2, 2))
cnn.add(Dropout(0.25))

cnn.add(Flatten()) # 3차원 텐서를 1차원 벡터로 변환

cnn.add(Dense(128, activation = 'relu')) # 은닉층 개념
cnn.add(Dropout(0.5))
cnn.add(Dense(10, activation='softmax')) # 출력층 개념

 

[4] CNN 모델 컴파일 및 학습

cnn.compile(loss='sparse_categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
hist=cnn.fit(x_train, y_train, batch_size=256, epochs=250, validation_data=(x_test, y_test)

 

[5] 모델 (정확도) 평가

cnn.evaluate(x_test, y_test)

[6] 정확도 및 손실

import matplotlib.pyplot as plt

plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Accuracy Trend')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train', 'validation'], loc = 'best')
plt.grid()
plt.show()

plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Lostt Trend')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'validation'], loc='best')
plt.grid()
plt.show()
반응형