728x90
728x90
Package Load
import os
import time
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import tensorflow as tf
from tensorflow.keras import layers
- numpy: Scientific computing과 관련된 여러 편리한 기능들을 제공해주는 라이브러리.
- matplotlib.pyplot: 데이터 시각화
- tensorflow: Tensor Flow를 로드.
- tensorflow.keras.layers: 모델의 각 Layer들을 만들기 위해 사용.
하이퍼파라미터 세팅
학습에 필요한 하이퍼파라미터의 값을 초기화한다. 하이퍼파라미터는 뉴럴네트워크를 통하여 학습되는 것이 아니라 학습률(laerning rate), 사용할 레이어의 수 등 설계자가 결재해줘야 한다.
배치의 크기(batch_size), 학습 할 epoch 수(max_epochs), 학습률(learning_rate)등의 값들을 다음과 같이 임의로 할당.
batch_size = 128
max_epochs = 5
learning_rate = 0.001
num_classes = 10
dataset load 및 tf.date.dataset 구축
# Load training and eval data from tf.keras
(train_data, train_labels), (test_data, test_labels) = \
tf.keras.datasets.fashion_mnist.load_data()
train_data = train_data / 255.
train_data = train_data.reshape([-1, 28 * 28])
train_data = train_data.astype(np.float32)
train_labels = train_labels.astype(np.int32)
test_data = test_data / 255.
test_data = test_data.reshape([-1, 28 * 28])
test_data = test_data.astype(np.float32)
test_labels = test_labels.astype(np.int32)
- FashionMNIST 데이터는 tf.keras.datasets에서 기본 제공.
- 아래 코드블록의 5번째 줄은 train_data의 값의 범위인 [0, 255]의 범위를 [0, 1]의 범위로 조절.
- 6번째 줄은 이미지 형태의 (28(높이), 28(너비)) 데이터를 네트워크의 입력으로 넣기 위해 1차원의 28*28=784 데이터로 변경.
- 10번째 줄부터 train_data를 변환한 방식으로 test_data를 변환.
tf.data.Dataset을 이용하여 input pipline 구축
# for train
N = len(train_data)
train_dataset = tf.data.Dataset.from_tensor_slices((train_data,train_labels))
train_dataset = train_dataset.shuffle(100)
train_dataset = train_dataset.batch(batch_size)
train_dataset = train_dataset.repeat(max_epochs)
print(train_dataset)
# for test
test_dataset = tf.data.Dataset.from_tensor_slices((test_data,test_labels))
test_dataset = test_dataset.batch(batch_size)
test_dataset = test_dataset.repeat(max_epochs)
print(test_dataset)
- tf.data.Dataset.from_tensor_slices API를 이용하여 train_data 및 train_labels데이터를 tf.data.Dataset 형태로 생성.마찬가지로 test_data, test_labels데이터도 tf.data.Dataset 형태로 생성.
- tf.data.Dataset.shuffle: 데이터셋을 shuffle.
- tf.data.Dataset.batch: 데이터셋의 batch_size를 결정.
- tf.data.Dataset.repeat: 데이터셋을 다 사용하더라도 반복 결정.
데이터 샘플 시각화
FashionMNIST는 MNIST와 마찬가지로 총 10개의 클래스로 구성되어 있으며 티셔츠, 바지 등 패션과 관련된 아이템들을 28 × 28 크기의 흑백 이미지로 구성한 데이터셋 이다.
아래의 코드 블록은 Fashion-MNIST 데이터를 시각화한다.
labels_map = {0: 'T-Shirt', 1: 'Trouser', 2: 'Pullover', 3: 'Dress', 4: 'Coat',
5: 'Sandal', 6: 'Shirt', 7: 'Sneaker', 8: 'Bag', 9: 'Ankle Boot'}
columns = 5
rows = 5
fig = plt.figure(figsize=(8, 8))
for i in range(1, columns*rows+1):
data_idx = np.random.randint(len(train_data))
img = train_data[data_idx].reshape([28, 28])
label = labels_map[train_labels[data_idx]]
fig.add_subplot(rows, columns, i)
plt.title(label)
plt.imshow(img, cmap='gray')
plt.axis('off')
plt.show()
모델 만들기
model = tf.keras.Sequential() # Sequential 모델 생성
model.add(tf.keras.layers.Flatten(input_dim = 784))
model.add(tf.keras.layers.Dense(512,activation="relu"))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.ReLU())
model.add(tf.keras.layers.Dense(10,activation="softmax"))
- Dense : 일반적인 완전 연결(densely-connected) 레이어
- BatchNormalization : 배치 노말라이제이션 레이어
- ReLU : ReLU 활성화 함수 레이어
데이터의 일부를 넣어서 모델 체크 및 요약하기
for images, labels in train_dataset.take(1):
print("predictions: ", model(images[0:3]))
model.summary()
predictions: tf.Tensor(
[[0.21350156 0.13173366 0.09303766 0.02701016 0.10155538 0.05713984
0.12158073 0.08974813 0.0896612 0.07503174]
[0.12742934 0.15420572 0.12073153 0.05624721 0.12699616 0.07270162
0.09469259 0.07258539 0.10605622 0.06835426]
[0.17587785 0.08923236 0.09938379 0.02737587 0.14121981 0.07377707
0.09433681 0.09706298 0.14461823 0.05711522]], shape=(3, 10), dtype=float32)
Model: "sequential_12"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_12 (Flatten) (None, 784) 0
_________________________________________________________________
dense_238 (Dense) (None, 512) 401920
_________________________________________________________________
batch_normalization_115 (Bat (None, 512) 2048
_________________________________________________________________
re_lu_109 (ReLU) (None, 512) 0
_________________________________________________________________
dense_239 (Dense) (None, 10) 5130
=================================================================
Total params: 409,098
Trainable params: 408,074
Non-trainable params: 1,024
_________________________________________________________________
Loss function 및 optimizer 정의
# model compile with optimizer, loss, metrics
model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate= 0.001),
loss = "sparse_categorical_crossentropy",
metrics = ["accuracy"])
- compile 앞서 정의한 model에서 training을 위해 loss와 optimizer를 지정해주세요. tf.Keras.Model.compile()
- loss : SparseCategoricalCrossentropy
- optimizer : 변수에 Adam optimizer를 앞에서 지정한 learning rate에 맞게 정의.
- metrics accuracy를 정의.
Training
model.fit(train_dataset,epochs=10)
###
Epoch 1/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0043 - accuracy: 0.9986
Epoch 2/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0031 - accuracy: 0.9991
Epoch 3/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0036 - accuracy: 0.9988
Epoch 4/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0047 - accuracy: 0.9985
Epoch 5/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0035 - accuracy: 0.9989
Epoch 6/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0039 - accuracy: 0.9988
Epoch 7/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0040 - accuracy: 0.9989
Epoch 8/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0032 - accuracy: 0.9990
Epoch 9/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0037 - accuracy: 0.9989
Epoch 10/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0042 - accuracy: 0.9986
<keras.callbacks.History at 0x7fab61885390>
###
- tf.keras.Model의 Method인 fit을 이용하여 학습.
- tf.data.Dataset으로 만든 객체인 train_dataset을 input값으로 설정.
output
test_batch_size = 100
batch_index = np.random.choice(len(test_data), size=test_batch_size, replace=False)
batch_xs = test_data[batch_index]
batch_ys = test_labels[batch_index]
y_pred_ = model(batch_xs, training=False)
fig = plt.figure(figsize=(10, 10))
for i, (px, py, y_pred) in enumerate(zip(batch_xs, batch_ys, y_pred_)):
p = fig.add_subplot(10, 10, i+1)
if np.argmax(y_pred) == py:
p.set_title("{}".format(labels_map[py]), color='blue')
else:
p.set_title("{}/{}".format(labels_map[np.argmax(y_pred)],
labels_map[py]), color='red')
p.imshow(px.reshape(28, 28))
p.axis('off')
Summary
- Multi layer perceptron을 설계할 수 있다.
- 네트워크에 ReLU, Batch normalization를 적용할 수 있다.
- tf.data.Dataset을 이용하여 데이터 입력 파이프라인(input pipeline)을 만들 수 있다.
- 손실 함수(loss function)와 옵티마이져(optimizer)를 정의할 수 있다.
- 손실(loss)을 측정하고 경사(gradient)를 계산해 모델 파라미터를 업데이트할 수 있다.
- 학습한 모델의 성능을 테스트할 수 있다.
728x90
728x90