728x90
반응형

CIFAR-10 데이터셋

  • 32 x 32 픽셀 크기 컬러 이미지 60,000개 구성

 

import numpy as np
from keras.utils import to_categorical
from keras.datasets import cifar10

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

NUM_CLASSES = 10

x_train = x_train.astype('float32') / 255.0 # 50000, 32, 32, 3
x_test = x_test.astype('float32') / 255.0 # 10000, 32, 32, 3 numpy 배열

y_train = to_categorical(y_train, NUM_CLASSES) # 50000, 1
y_test = to_categorical(y_test, NUM_CLASSES) # 10000, 1  = 0~ 9 사이의 정수 레이블
  • 신경망은 입력이 -1과 1사이 범위에 놓여 있을 때 가장 잘 동작하기 때문에 데이터를 255로 나눈다.
  • 정수 레이블 웟-핫 인코딩 벡터로 바꾼다.
    • 어떤 이미지의 클래스 정수 레이블이 i라면, 이것의 원-핫 인코딩은 i번째 원소가 1이고 그 외에는 모두 0인 길이가 10(클래스 개수)인 벡터
    • y_train = 50000, 10
    • y_test = 10000, 10
x_train[54,12,13,1] # 0.36862746
  • 첫 번째 차원은 데이터셋에 있는 이미지의 인덱스, 두 번째와 세 번째 차원은 이미지 높이와 너비, 마지막 차우너은 컬러 채널(RGB 빨강, 초록, 파랑)
  • 4차원 텐서

 

모델 만들기

# 모델 사용한 네트워크

from keras.models import Sequential
from keras.layers import Flatten, Dense

model = Sequential([
    Dense(200, activation = 'relu', input_shape = (32,32,3)),
    Flatten(),
    Dense(150, activation = 'relu'),
    Dense(10, activation = 'softmax'),
])
  • 일렬로 층을 쌓은 네트워크를 빠르게 만들 때 사용하기 좋다.
  • Flatten층은 입력을 하나의 벡터로 펼치다. = 3,072(32 x 32 x 3)
# 함수형 API를 사용한 네트워크


from keras.models import Model
from keras.layers import Input, Flatten, Dense

input_layer = Input(shape=(32,32,3))

x = Flatten()(input_layer)

x = Dense(units = 200, activation = 'relu')(x)
x = Dense(units = 150, activation = 'relu')(x)

output_layer = Dense(units=10, activation = 'softmax')(x)

model = Model(input_layer, output_layer)
  • 유언성이 많은 네트워크를 만들려면 유연성이 많은 함수형 API를 사용해야 한다.

 

렐루(Relu)

  • 입력이 음수이면 0이고 그 외에는 입력과 동일한 값을 출력한다.

 

리키렐루(LeakyReLU)

  • 한 가지만 빼고 렐루오 매우 비슷하다.
  • 입력에 비례하는 작은 함수를 반환한다.
    • 절편이 이미 큰 음수 값을 가지고 있어서 렐루 함수가 항상 0을 출력한다면 이 유닛은 아무것도 학습할 수 없기 때문
    • 이 경우 그레이디언트(gradient)가 0이 되어 어떤 에러도 이 유닛을 통해 전파되지 않는다.
    • 리키렐루 함수는 그레이딩너트가 0이 되지 않도록 해 이 문제를 해결한다.

 

시그모이드(Sigmoid)

  • 출력을 0에서 1사이로 조정하고 싶을 때 유용하다.
  • 이진 분류, 샘플이 하나 이상의 클래스에 속할 수 있는 다중 레이블 분류 문제에서 사용한다.

 

소프트맥스(Softmax)

  • 층의 전체 출력 합이 1이 되어야 할 때 사용한다.

 

 

model.summary()

[그림1] summary 메서드 출력

  • None을 사용해 아직 네트워크에 전달될 샘플의 개수를 모른다는 것을 푝시
  • summary 메서드는 각 층에서 훈련될 파라미터(가중치)의 수도 알려준다.

 

 

모델 컴파일

  • 손실 함수(loss function)와 옵티마이저(optimizer)를 연결한다.
# 모델 컴파일

from keras.optimizers import Adam

opt = Adam(lr=0.0005)
model.compile(loss = 'categorical_crossentropy', optimizer = opt,
             metrics = ['accuracy'])
  • 가장 많이 사용하는 손실 함수 세 가지

평균 제곱 오차(mean squared error)

  • 신경망이 회귀(연속적인 값 예측)를 풀기 위해 설계되었을 때 사용
  • 각 샘플의 정답 y과 예측 값 p 사이 차이를 제곱하고 모든 샘플에 대해 평균한 것

 

범주형 크로스 엔트로피(categorical cross-entropy)

  • 샘플이 여러 클래스 중 하나에 속해야 하는 분류 문제일 경우

 

이진 크로스 엔트로피(binary cross-entropy)

  • 하나의 출력 유닛을 가진 이진 분류 문제이거나 샘플이 여러 개의 클래스에 속할 수 있는 다중 레이블 분류 문제라면 이진 크로스 엔트로피를 사용해야 한다.

 

옵티마이저

  • 손실 함수의 그레이디언트를 기반으로 신경망의 가중치를 업데이트하기 위해 사용하는 알괼즘
  • 학습률이 클수록 한 번의 훈련 스템에서 가중치를 크게 바꾼다.
    • 학습률이 크면 초기에 훈련 속도가 빠르지만 훈련이 조금 불안정한 단점이 있고 손실 함수의 최솟값을 찾지 못할 수도 있기에 훈련 과정에서 튜닝하고 조정해야 한다.

 

 

 

모델 훈련

# 모델 훈련

model.fit(x_train,
         y_train,
         batch_size = 32,
         epochs=10,
         shuffle=True) # shuffle True면 훈련 스텝마다 배치를 훈련 데이터에서 중복을 허용하지 않고 랜덤하게 추출한다.

[그림2] 훈련 결과

  • batch_size는 훈련 스텝마다 몇 개의 이미지로 배치를 만들 것인지 결정한다.

 

 

모델 평가

# 모델 평가
model.evaluate(x_test, y_test)

[그림3] 모델 평가 결과

  • 범주형 크로스 엔트로피의 손실값과 정확도
# 테스트 세트에 대한 예측 결과 확인

CLASSES = np.array(['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog',
                   'frog', 'horse', 'ship', 'truck'])

preds = model.predict(x_test)
preds_single = CLASSES[np.argmax(preds, axis= -1)]
actual_single = CLASSES[np.argmax(y_test, axis= -1)]
import matplotlib.pyplot as plt

n_to_show = 10
indices = np.random.choice(range(len(x_test)), n_to_show)

fig = plt.figure(figsize=(15,3))
fig.subplots_adjust(hspace=0.4, wspace=0.4)

for i, idx in enumerate(indices):
    img = x_test[idx]
    ax = fig.add_subplot(1, n_to_show, i+1)
    ax.axis('off')
    ax.text(0.5, -0.35, 'pred = ' + str(preds_single[idx]), fontsize=10,
           ha = 'center', transform=ax.transAxes)
    ax.text(0.5, -0.7, 'act = ' + str(actual_single[idx]), fontsize=10,
           ha = 'center', transform=ax.transAxes)
    ax.imshow(img)

[그림4] 예측과 실제 레이블

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

http://www.yes24.com/Product/Goods/81538614?OzSrank=1

 

미술관에 GAN 딥러닝 실전 프로젝트 - YES24

창조에 다가서는 GAN의 4가지 생성 프로젝트 이 책은 케라스를 사용한 딥러닝 기초부터 AI 분야 최신 알고리즘까지 설명한다. 기계 스스로 그림을 그리고, 글을 쓰고, 음악을 작곡하고, 게임을 하

www.yes24.com

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기