파이썬/ai

[ai, python] Neural Network

hojung 2022. 5. 29. 13:40
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
반응형