AI/Deep Learning

[Tensorflow 2.x / Keras] 기본 -2 패션 MNIST 데이터 셋 활용 / 인공신경망-2 / 다층

Jeong Jeon
반응형

지난 번에는 인공신경망에 1층만 만들어서 훈련시켜보았다.

 

당연히 여러개의 층을 두어 복잡하게, 조금더 높은 성능을 낼수 있을거라고 예상했다.

 

이번에는 여러층의 모델을 만들어보려고 한다.

 

1). 기존과동일 하게 데이터셋을 준비한다. 추가로 검증셋까지...

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_input.reshape(-1,28*28)# -1 : 첫번째 차원은 그대로두고 나머지 차원만 바꾼다.
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled,train_target,test_size=0.2,random_state=42)

2). Sequantial 모델을 만들고 , Dense층을 두개 넣어보자.

한개는 sigmoid 함수를 적용한 Dense층, 한개는 softmax 함수를 적용한 Dense층이다.

이떄 유의할점은 꼭 출력층을 마지막에 둬야한다는 것이다.

model=keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid',input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))
model.summary()

==> 결과 

여기서 중요한 정보들이 포함되어있으니, 다시한번 짚어보고 가자.

  • 뉴런의 갯수는 정해지지는 않았지만, 다음층(출력층)의 뉴런의 개수보다는 많아야한다. 그렇지 않으면 정보를 전달할때 누락된다.
  • 층이름을 정하지 않으면 자동으로 dense라고 이름이 지어진다.
  • 출력크기(None,100)에서 None과 100은 무엇일까?
    • None : keras에서는 fit()으로 훈련을 시킬때 전달한 데이터를 한번에 사용하지 않고 경사하강법을 수행하기 때문에, 미니배치 경사하강법이 적용되어 쪼개서 데이터를 활용한다. 그렇기때문에 별도로 샘플 갯수를 지정하지 않았기 때문에 None이 나오게된다.
    • 100 : 출력개수 =>은닉층의 뉴런개수를 100으로 잡았기때문에 100개의 출력이 나온다는 뜻이다. 이과정을 보면 샘플마다 784개의 픽셀값이 은닉층을 통과하면서 100개의 특성으로 압축되는것을 확인 할 수있다.

3). 모델 훈련

손실함수는 이전과 동일하게 sparse_categorical_crossentropy를 사용했다.

훈련해보자.

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled,train_target, epochs=5)

이렇게 우리는 1층이아닌 여러개의 층을 추가해서 인공신경망 모델을 만들수 있게되었다.

아직까지 무언가.... 많이 부족한 느낌이다

반응형