1. Fashion MNIST data
Mnist데이터베이스는 대형 데이터 베이스이며 다양한 화상 처리 시스템을 트레이닝하기 위해 사용된다. 나는 이번에 MNIST의 Fashion 데이터를 이용해서 neural network를 작성해 볼 것이다.
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
keras에서 fashion MNIST 데이터를 import해준다.
print(train_input.shape, train_target.shape)
데이터의 양과 형태를 살펴보면 다음과 같은 결과가 나오게 된다.
MNIST data에 있는 라벨을 확인해보면 다음과 같다.
import numpy as np
print(np.unique(train_target, return_counts=True))
numpy배열을 이용해서 label을 확인해보면 다음과 같다.
총 10종류의 라벨이 존재하고 각각의 라벨별로 6000개의 데이터가 존재한다.
2. 데이터 전처리
# Data preprocessing
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
print(train_scaled.shape)
우선 fashion MNIST의 데이터들을 전처리 해준다. 255픽셀 값으로 표현하기 위해 255로 나눠주고
train_scaled.reshape함수를 이용해서 2차원 배열인 각 샘플을 1차원 배열로 만들어준다. FC layer를 만들어주기 위함이다.
reshape(-1, 정수)의 경우 -1의 의미는 뒤에 입력된 정수의 크기만한 열이 생성되도록 행의 길이를 정하는 것이다.
여기서는 28*28 즉 784개의 열을 만들겠다는 것이고 trainning data가 아까 60000개였으니 60000*784크기의 matrix가 생성된다.
from sklearn.model_selection import train_test_split
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
sklearn의 train_test_split 함수를 이용해서 train data와 val data로 나눠주었다.
test size를 0.2로 주었기 때문에 60000개의 0.2프로인 12000개의 val set 48000개의 trainning set으로 나뉠 것이다.
3. KERAS- ANN
# dense layer 생성
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
model = keras.Sequential(dense)
keras의 Dense 함수를 이용해서 activation함수와 출력 뉴런의 개수를 정해주고 input shape은 열의 개수인 784를 넣어준다. 여기서 출력 뉴런의 개수는 첫번째 인자인 10에 해당한다.
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
여기서 아까 만들어준 ANN모델의 cross entropy loss를 걸어주고 epoch를 5정도 학습시켜본다.
model.evaluate(val_scaled, val_target)
그 후 evaluate함수를 이용해서 val 데이터에 대한 정확도를 평가해보면 다음과 같다.
4. keras- DNN
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
from sklearn.model_selection import train_test_split
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
위와 같은 방법으로 데이터를 준비한다.
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')
단 여기서는 첫 번째 layer에서는 출력 뉴런이 100개 두 번째 layer에서는 출력 뉴런이 10개이고 각각 activation 함수로 sigmoid와 softmax함수를 준다.
model = keras.Sequential([dense1, dense2])
model.summary()
keras.Sequential 함수를 이용해서 모델을 만들고 간략하게 살펴보면 다음과 같다. Sequential 메소드는 레이어를 선형으로 연결하여 구성해준다.
5. Layer를 추가하는 다른 방법
model = keras.Sequential([
keras.layers.Dense(100, activation='sigmoid', input_shape=(784,), name='hidden'),
keras.layers.Dense(10, activation='softmax', name='output')
], name='패션 MNIST 모델')
model.summary()
Sequential 메소드에 그냥 Dense함수를 집어 넣어줘도 아까와 같이 동작한다.
model = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))
add메소드를 이용해 레이어를 추가할수도 있다.
6. Optimizer
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy')
sgd = keras.optimizers.SGD(learning_rate=0.1)
keras에서는 기본적으로 SGD메소드를 제공해준다. SGD란 경사 하강법 옵티마이저로 momentum을 주고 learning rate를 통해 loss function을 이동하면서 loss function의 gradient최소 값을 찾아낸다.
# nesterov momentum optimization
sgd = keras.optimizers.SGD(momentum=0.9, nesterov=True)
# Adagrad
adagrad = keras.optimizers.Adagrad()
model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy')
# RMSprop
rmsprop = keras.optimizers.RMSprop()
model.compile(optimizer=rmsprop, loss='sparse_categorical_crossentropy', metrics='accuracy')
다양한 종류의 optimizer가 존재한다.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
model.evaluate(val_scaled, val_target)
아까 생성한 모델에서 adam optimizer를 사용해서 역전파를 통해 성능을 개선시키면 더 좋은 결과가 나온다.
'파이썬 > ai' 카테고리의 다른 글
[ai, python] IMDB데이터베이스의 리뷰 데이터와 RNN을 이용한 리뷰 감성 분류하기 (3) | 2022.05.29 |
---|---|
[ai, python] - Image분류 by CNN (2) | 2022.05.29 |
[ai, python] 인천광역시 집 값 예측 - 모델 구축 (MLP) (0) | 2022.05.21 |
[ai, python]인천광역시 집 값 예측 machine Learning - 데이터 전처리 3 in Colab (0) | 2022.05.21 |
[ai, python] 인천광역시 집값 예측 프로젝트- 데이터 전처리 2 (0) | 2022.05.18 |
댓글