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()
- 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면 훈련 스텝마다 배치를 훈련 데이터에서 중복을 허용하지 않고 랜덤하게 추출한다.
- batch_size는 훈련 스텝마다 몇 개의 이미지로 배치를 만들 것인지 결정한다.
모델 평가
# 모델 평가
model.evaluate(x_test, y_test)
- 범주형 크로스 엔트로피의 손실값과 정확도
# 테스트 세트에 대한 예측 결과 확인
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)
http://www.yes24.com/Product/Goods/81538614?OzSrank=1
728x90
반응형
최근댓글