Keras 의 내장 데이터 세트

- 종류

  • boston housing: 보스톤 집값으로 회귀에 사용
  • cifar10: 이미지 분류 데이터로 종류가 10가지
  • cifar100: 이미지 분류 데이터로 종류가 100가지
  • mnist: 손 글씨 데이터
  • fashion mnist: 의류 데이터로 클래스가 10가지
  • imdb: 영화 데이터로 분류에 활용
  • reuters: 뉴스 토픽 - 자연어 분류

- load_data 라는 함수를 호출하면 훈련 데이터 튜플 과 테스트 데이터 튜플로 데이터를 리턴
- 각각의 튜플은 피처 와 레이블로 나뉘어져 있음

 

 

 

1. 데이터 가져오기

fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()

print(X_train_full.shape) #28 * 28 에 해당하는 이미지 6만개
print(X_test.shape)
print(y_test.shape)
(60000, 28, 28)

(10000, 28, 28)

(10000,)

 

X_train_full[0] #0부터 255까지의 값으로 되어 있음
  • 딥러닝은 0 ~ 1 사이의 실수인 경우 학습을 더 잘하는 것으로 알려져 있음
  • 값을 변경하지 않아도 학습은 가능하지만 되도록이면 0 ~ 1 사이의 숫자로 변환해주는 것이 좋습니다.

 

 

 

2. 정규화 및 훈련/검증 데이터 분할

X_valid, X_train = X_train_full[:5000] / 255. , X_train_full[5000:] / 255.
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
X_test = X_test/255.

 

 

# 이미지 1개 출력

plt.imshow(X_valid[0], cmap='binary')

 

 

# 각 클래스의 실제 레이블을 배열로 생성

class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",
              "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
print(y_train[0])
print(class_names[y_train[0]])
plt.imshow(X_train[0], cmap='binary')
4
Coat


 

 

 

 

 

3. Flatten Layer

  • 데이터의 차원을 1차원으로 변경해주는 Layer
  • Dense Layer 는 입력받는 데이터의 차원이 1차원만 가능
    • Dense Layer는 입력 데이터의 차원을 1차원으로 변경해서 사용해야 합니다.
    • 이미지 데이터의 경우는 변환을 해서 사용해야 합니다.
  • Flatten Layer를 자동으로 1차원으로 변경을 수행합니다.
print(np.array([[1, 2], [3, 4]]).flatten())
[1 2 3 4]

 

 

 

- 활성화 함수

- ReLU: max(0, x)
- Leaky ReLU: max(x, 0.1x) - 이론적으로 기울기 소실이 일어날 수 있지만 실제로는 거의 일어나지 않음

 

 

 

 

 

4. 모델 생성

model = keras.models.Sequential()
  • Dense는 데이터의 차원을 1차원으로 입력을 받아야 합니다.
  • 이미지 데이터의 경우는 가로 * 세로 또는 가로 * 세로 * 채널의수 로 입력
  • Flatten 은 원본 이미지의 차원을 주면 1차원으로 수정을 합니다.
model.add(keras.layers.Flatten(input_shape=[28, 28])) #Input Layer
model.add(keras.layers.Dense(300, activation="relu")) #Hidden Layer
model.add(keras.layers.Dense(200, activation="relu")) #Hidden Layer
model.add(keras.layers.Dense(100, activation="relu")) #Hidden Layer
  • Output Layer의 units 는 출력의 개수가 되어야 합니다.
  • 분류 문제는 활성화 함수로 softmax 가 잘 동작합니다.
  • 출력을 하나로 만들고자 하면 sigmoid를 사용하면 됩니다.
model.add(keras.layers.Dense(10, activation="softmax")) #Output Layer

 

 

 

 

 

5. 모델 구조 확인

model.summary()

 

 

- 손실 함수

  • 출력층의 활성화 함수가 sigmoid: binary_crossentropy
  • 출력층의 활성화 함수가 softmax: 
    • categorical_crossentropy(원핫인코딩 된 경우)
    • sparse_categorical_crossentropy(원핫인코딩 안된 경우)

 

 

- 옵티마이저

  • 손실을 낮추기 위해서 신경망의 가중치 와 학습률 등의 신경망의 속성을 변경하는데 사용되는 최적화 방식
  • 종류
    • SGD(확률적 경사하강법)
    • RMSprop
    • Adam: 가장 많이 사용되는 알고리즘으로 좋은 성능을 내는 것으로 알려져 있음
    • Adadelta
    • Adagrad
    • Nadam
    • Ftrl

 

- 평가 지표

  • 분류: auc, precision, recall, accuracy
  • 회귀: mse, mae, rmse

 

 

 

 

6. 모델 complie

model.compile(optimizer='adam',
             loss='sparse_categorical_crossentropy', 
             metrics=['accuracy'])

# 모델 훈련
history = model.fit(X_train, y_train, epochs=30,
                   validation_data = (X_valid, y_valid))

 

 

# 일반화 오차 - 평가

model.evaluate(X_test, y_test)

 

 

# 예측

  • predict: 각 클래스에 대한 기댓값
  • predict_classes: 가장 높은 클래스가 리턴
X_new = X_test[:3]
y_proba = model.predict(X_new)
print(y_proba.round(3))

 

y_pred = np.argmax(model.predict(X_new), axis=-1)
print(y_pred)
print(np.array(class_names)[y_pred])