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] |
- 활성화 함수
- 입력을 비선형 출력으로 변환해주는 함수
- 선형 관계를 나타내는 함수에 비선형성을 추가하는 방법
- Sigmoid, ReLU, Leaky ReLU, 하이퍼볼릭 탄젠트(tanh) 등이 있는데 적용하는 방법 https://www.tensorflow.org/api_docs/python/tf/keras/activations
- 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])
![]() |
'Python > Python 실전편' 카테고리의 다른 글
[전처리] 지도 출력 Choropleth (0) | 2024.03.20 |
---|---|
[전처리] 서울시 구별 CCTV와 인구 관계 분석 (0) | 2024.03.20 |
[딥러닝] Keras 이항분류 _ 레드와 화이트와인 분류 (0) | 2024.03.20 |
[Python] 선형회귀 실습 _ 보스톤 주택 가격에 대한 선형 회귀 (0) | 2024.03.18 |
[Python] 연관분석 실습 _ 아이템 기반 추천 시스템 (1) | 2024.03.18 |