관리 메뉴

ComputerVision Jack

[케라스 Chapter3 정리] 본문

DeepLearning/케라스 - Keras Lib

[케라스 Chapter3 정리]

JackYoon 2020. 1. 15. 20:23
반응형

케라스 신경망 구조

실행환경 : colab

케라스 신경망 훈련 요소

  • 네트워크(모델) 구성 층
  • 입력 데이터와 대응하는 라벨
  • cost함수
  • optimizer(최적화)

model.add(layers.Dense(32, input_shape = (784, )))

model.add(layers.Dense(10))

# 모델에 추가된 층을 자동으로 상취 층의 크기에 맞춰진다.

출력층의 크기를 자동으로 채택

 

 이런 네트워크 구조는 다양하게 존재한다.(가지 네트워크, 출력 여러개 네트워크, 인셉션 블록)

따라서 적절한 네트워크 구조를 채택해야한다.

 

네트워크를 정하면 손실 함수와 옵티마이저를 선택한다.

다출력 신경망은 여러개의 손실함수를 갖는다. 그러나 경사 하강법은 scalar의 손실 기준값으로 하기 때문에

여러 네트워크 손실함수를 추합하여 하나의 스칼라값으로 만든다.

 

케라스

딥러닝 모델을 간편하게 만들고 훈련할 수 있는 파이썬 프레임워크

 

[모델을 정의하는 2가지 방법]

1. Sequential 클래스(층을 순서대로 쌓아올린 네트워크)

 

from keras import models

from keras import layers

 

model = models.Sequential()

model.add(layers.Dense(32, activation = 'relu', input_shape(784, )))

model.add(layers.Dense(10, activation = 'softmax')

 

2.함수형 API(임의의 구조를 만드는 비순환 유향 그래프 제작)

 

input_tensor = layers.Input(shape = (784,))

x = layers.Dense(32, activation = 'relu')(input_tensor)

output_tensor = layers.Dense(10, activation = 'softmax')(x)

 

model = models.Model(inputs = input_tensor, outputs = output_tensor)

 

컴파일 단계는 동일하다.

영화 리뷰 분류 : 이진 분류 예제

2종 분류 (이진분류) - 긍정과 부정으로 분류하기

 

fromkeras.datasets import imdb

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words = 10000)

#imdb dataset을 다운로드 받는다.

그리고 미리 준비된 딕셔너리에 인덱스 매필을 시킨다.

 

신경망에는 숫자 리스트를 주입할 수 없다. 따라서 리스트를 텐서로 바꾸는 방법엔 2가지가 있지만

one_hot코딩을 사용하여 0과1 벡터로 변환한다.

 

네트워크 Dense를 쌓을 경우 두가지 구조상 결정이 필요하다.

  • 얼마나 많은 층을 사용할 것인가?
  • 각 층에 얼마나 많은 은닉 유닛을 둘 것인가?

model = models.Sequential()

model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))

model.add(layers.Dense(16, activation='relu'))

model.add(layers.Dense(1, activation='sigmoid'))

#네트워크 생성 - 이진분류 sigmoid 활성함수를 사용한다.

 

[활성함수 필요 이유]

활성함수가 없다면 Dense층은 선형적인 연산만 이루어진다.

연산과정을 간단하게 몇개의 퍼셉트론을 만들어 보면 알 수 있다. 따라서 모델을 풍부하게 만들어 층을 깊게 만드는 

비선형성 또는 활성함수를 추가해야 한다.

 

[cost함수]

binary_crossentropy함수를 사용한다. (이진분류 손실 함수)

mean_squared 함수를 사용해도 된다.

 

model.compile(optimizer='rmsprop',

              loss='binary_crossentropy',

              metrics=['accuracy'])

#compile()함수를 사용하여 학습을 준비하고 fit 시켜면 결과가 도출 된다.

model.compile(optimizer='rmsprop',

              loss='binary_crossentropy',

              metrics=['accuracy'])

history = model.fit(partial_x_train,

                    partial_y_train,

                    epochs=20,

                    batch_size=512,

                    validation_data=(x_val, y_val))

#책에 이런식으로 묶여 있어 둘다 한줄에 첨부했더니 오류

따라서 history는 따로 분류하고 돌려주면 해결

loss
accuracy

training set에 대해선 완벽한 학습이 이루어지지만 새로운 test set에 대해선 과적합이 약간 발생하는 것을 볼 수 있다. validation과 training은 다릅다.

뉴스 기사 분류 : 다중 분류 문제

로이터 뉴스 데이터를 이용한 분류 문제

46개의 토픽으로 분류하는 다중 분류 - 단일 레이블 다중 분류

앞 예제와 많은 분이 비슷하다.

model = models.Sequential()

model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))

model.add(layers.Dense(64, activation='relu'))

model.add(layers.Dense(46, activation='softmax'))

#다른점은 마지막 활성화 함수가 softmax이다.

mnist와 마찬가지로 이진이 아닌 여러개의 분류 클래스 사이중 맞는 클래스에 들어가야 하기 때문이다.

 

[손실함수]

model.compile(optimizer='rmsprop',

              loss='categorical_crossentropy',

              metrics=['accuracy'])

#손실 함수 또한 binary에서 categorical crossentropy로 바뀐다.

 

history를 봐서 학습 진행을 확인한다.

loss
acc

9번째 epoch 이후 acc가 증가하지 않은 걸로봐서 과적합이 발생했음을 알 수 있습니다.

 

[충분히 큰 중간층]

model = models.Sequential()

model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))

model.add(layers.Dense(4, activation='relu'))

model.add(layers.Dense(46, activation='softmax'))

#중간층 유닛을 줄이면 검증 정확도의 값이 더 내려간다

이는 많은 정보를 중간층의 저차원으로 압축하려고 했기 때문이다.

따라서 적절히 큰 중간층이 필요하다.

주택 가격 예측 : 회귀 문제

분류가 아닌 특정한 value를 예측하는 회귀 문제

보스턴 주택 가격 데이터 섹을 이용하여 회귀 예측을 한다.

 

mean = train_data.mean(axis = 0)

train_data -= mean

std = train_data.std(axis = 0)

train_data /= std

 

test_data -= mean

test_data /= std

#우선 받아온 데이터에 대해 정규화를 해준다.

값의 차이가 너무 많이 차이나면 모델이 예측 정확도가 낮아진다.

 

  model = models.Sequential()

  model.add(layers.Dense(64, activation = 'relu', input_shape=(train_data.shape[1],)))

  model.add(layers.Dense(64, activation = 'relu'))

  model.add(layers.Dense(1))

  model.compile(optimizer='rmsprop', loss= 'mse', metrics=['mae'])

#마지막 층에 활성함수가 없다.

회귀는 어느 하나값으로 onehot작업을 하지 않고 특정 value를 예측하는 문제이기 때문에

제약을 두지 않는다.

또한 손실 함수로 rmsprop 평균 제곱 오차 함수를 사용한다.

 

[K-겹 교차 검증]

데이터를 k개의 분할로 나누고 k개의 모델을 만들어 k-1개의 분할에서 훈련하고 나머지 분할에서 평가하는 방법

예 3겹이면 

폴드 1 - 검증 훈련 훈련 --

폴드 2 - 훈련 검증 훈련 -- 검증점수 평균으로 취합

폴드 3 - 훈련 훈련 검증 --

식의 구성이 이루어진다.

데이터가 작을 경우 실행하는 방법

mae

80 epoch 이후 올라간다. 과적합이 발생했음을 알 수 있다.

03-4영화 리뷰 분류 _ 이진 분류 예제.ipynb
0.05MB
03-5 뉴스 기사 분류 _ 다중 분류 문제.ipynb
0.05MB
03-6 주택 가격 예측 _ 회귀 문제.ipynb
0.06MB

반응형

'DeepLearning > 케라스 - Keras Lib' 카테고리의 다른 글

[케라스 Chapter6 정리]  (0) 2020.02.11
[케라스 Chapter5 정리]  (0) 2020.01.31
[케라스 Chapter4 정리]  (0) 2020.01.28
[케라스 Chapter2 정리]  (0) 2020.01.14
[케라스 Chapter1 정리]  (0) 2020.01.14
Comments