Open danbi5228 opened 2 years ago
$ python3 -m pip install -U tensorflow
import tensorflow as tf
from tensorflow import keras
tf.version keras.version
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. 훈련 세트 첫 번째 이미지는 코트 이미지 라는 것을 의미
두 개 은닉층으로 이루어진 분류용 다층 퍼셉트론
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))
Flatten층은 입력 이미지를 1D 배열로 변환 = X.reshape(-1,1)
첫 번째 층이므로 input_shape 지정해야 함
뉴런 300개, 100개를 가진 Dense 층 2개 추가, 각각 활성화 함수는 'ReLU'
Dense 층은 각자 가중치 행렬 관리, 또한 층의 뉴런과 입력 사이의 모든 연결 가중치가 포함
다음과 같이 층을 하나씩 추가하지 않고, Sequential 모델 형식으로도 전달 가능
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.Dense(300, activation="relu"),
keras.layers.Dense(100, activation="relu"),
keras.layers.Dense(10, activation="softmax")
])
모델 summary() 메서드는 모델에 있는 모든 층을 출력
model.summary()
Model: "sequential"
flatten (Flatten) (None, 784) 0
dense (Dense) (None, 300) 235500
dense_1 (Dense) (None, 100) 30100
Total params: 266,610 Trainable params: 266,610 Non-trainable params: 0
- 파라미터가 많아서 훈련 데이터를 학습하기에 충분한 유연성을 가짐
- 훈련 데이터가 부족하다면 과대적합의 위험을 갖는다는 의미이기도 함
- 다음과 같이 모델의 층의 리스트를 출력하거나 인덱스로 층을 쉽게 선택할 수 있음
```python
hidden1 = model.layers[1]
hidden1.name
# 'dense'
weights, biases = hidden1.get_weights()
weights
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
biases
biases.shape
- Dense층은 연결 가중치를 무작위로 초기화, 편향은 0으로 초기화
- 다른 초기화 방법을 사용하고 싶으면 kernel_initializer와 bias_initializer 사용 가능