파이썬/ai

[ai, python] Neural Network

hojung 2022. 5. 29.
728x90
반응형

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)

데이터의 양과 형태를 살펴보면 다음과 같은 결과가 나오게 된다. 

60000개의 트레이닝 데이터

 

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 데이터에 대한 정확도를 평가해보면 다음과 같다. 

85%의 정확도


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함수를 집어 넣어줘도 아까와 같이 동작한다. 

레이어를 Sequential 메소드에 바로 추가

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를 사용해서 역전파를 통해 성능을 개선시키면 더 좋은 결과가 나온다. 

88%의 정확도

 

728x90
반응형

댓글