njs03332 / ml_study

3 stars 0 forks source link

2022/11/03 ~ 2022/11/09 #49

Open danbi5228 opened 2 years ago

danbi5228 commented 2 years ago
njs03332 commented 2 years ago

10.2 케라스로 다층 퍼셉트론 구현하기

10.2.1 텐서플로 2 설치

tf.version keras.version

danbi5228 commented 2 years ago

10.2.2 시퀀셜 API를 사용하여 이미지 분류기 만들기

케라스를 사용하여 데이터셋 적재하기

import tensorflow as tf
from tensorflow import keras

# 1. 데이터 로드 - 이미 훈련세트와 테스트세트로 나누어져 있음
fashion_minst = keras.datasets.fashion_mnist
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()

# 2. 훈련세트 크기와 데이터 타입 확인
X_train_full.shape # (60000, 28, 28)
X_train_full.dtype # dtype('uint8')

# 3. 훈련세트로부터 검증세트 만들기
# 경사 하강법으로 신경망 훈련을 하기 때문에 입력 특성의 스케일에 대해
# 간단하게 픽셀 강도를 255로 나누어 0~1 사이로 범위 조정 (자동으로 실수 변환)
X_valid, X_train  = X_train_full[:5000] / 255.0, X_train_full[5000:] / 255.0
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
X_test /= 255.0

# 4. 레이블에 해당하는 아이템을 나타내기위한 클래스 이름의 리스트 만들기
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", 
               "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
class_names[y_train[0]] # Coat. 훈련 세트 첫 번째 이미지는 코트 이미지 라는 것을 의미
givitallugot commented 2 years ago

시퀀셜 API를 사용하여 모델 만들기

Model: "sequential"


Layer (type) Output Shape Param #

flatten (Flatten) (None, 784) 0


dense (Dense) (None, 300) 235500


dense_1 (Dense) (None, 100) 30100


dense_2 (Dense) (None, 10) 1010

Total params: 266,610 Trainable params: 266,610 Non-trainable params: 0


- 파라미터가 많아서 훈련 데이터를 학습하기에 충분한 유연성을 가짐
- 훈련 데이터가 부족하다면 과대적합의 위험을 갖는다는 의미이기도 함
- 다음과 같이 모델의 층의 리스트를 출력하거나 인덱스로 층을 쉽게 선택할 수 있음
```python
hidden1 = model.layers[1]
hidden1.name

# 'dense'

array([[ 0.02448617, -0.00877795, -0.02189048, ..., -0.02766046, 0.03859074, -0.06889391], ..., 0.00034875, 0.02878492], [-0.06022581, 0.01577859, -0.02585464, ..., -0.00527829, 0.00272203, -0.06793761]], dtype=float32)

weights.shape

(784, 300)

biases

array([0., 0., 0, 0., ..., 0., 0., 0.], dtype=float32)

biases.shape

(300, )


- Dense층은 연결 가중치를 무작위로 초기화, 편향은 0으로 초기화
- 다른 초기화 방법을 사용하고 싶으면 kernel_initializer와 bias_initializer 사용 가능