관리 메뉴

ComputerVision Jack

[케라스 Chapter7정리] 본문

DeepLearning/케라스 - Keras Lib

[케라스 Chapter7정리]

JackYoon 2020. 2. 18. 01:51
반응형

케라스 함수형 API

케라스의 함수형 API(Functional API)를 사용해서 그래프 구조를 띤 모델을 만들거나 하나의 층을 다른 입력에

같이 사용하고, 케라스 모델을 함수처럼 사용할 수 있다.

 

함수형 API가 필요한 이유

기존 Sequential모델은 네트워크의 입력과 출력이 하나이다.

하지만 최근의 개발되는 많은 신경망 구조는 선형적이지 않은 네트워크 토폴로지가 필요하다.

비순환 유향 그래프와 같은 구조를 띈다.

 

[인셉션 모듈] - 비순환 유향 그래프의 예제. 입력이 나란히 놓인 여러개의 합성곱 층을 거쳐 하나의 텐서로 합쳐진다.

인셉션 모듈 : 나란히 놓인 합성곱 층으로 구성된 서브그래프

최근에 잔차 연결을 추가하기도 한다.

[잔차 연결] - 하위 층의 출력텐서를 상위층의 출력 텐서에 더해서 아래층의 표현이 네트워크 위쪽으로 흘러가게 한다.

잔차 연결

함수형 API 소개

함수형 API는 직접 텐서들의 입출력을 다룬다. 함수처럼 층을 사용하여 텐서를 입력받고 추력한다.

input_tensor = Input(shape = (32, ))

dense = layers.Dense(32, activation = 'relu')

output_tensor = dense(input_tensor)

#입력을 생성하고 층을 제작후 출력 부분에서 층에 입력을 넣어 출력한다.

 

model = Model(input_tensor, output_tensor)

#입력 텐서와 출력텐서로 Model 객체를 만든다. 자동적으로 필요한 층을 추출한다.

 

다중 입력 모델

서로 다른 입력 가지를 합치기 위해 여러 텐서를 연결할 수 있는 층을 사용한다.

 

입력 2개인 모델 훈련 방법

  • 넘파이 배열 : 리스트 주입
  • 넘파이 배열 : 딕셔너리 주입

다중 출력 모델

다중 입력 뿐만이 아니라 다중 출력 모델을 만들 수 있다.

하지만 모델을 훈련하려면 네트워크 출력마다 다른 손실함수를 적용하여 출력을 뽑아낸다.

그 후 손실 값을 합치면 된다.

model.compile( loss = {'first' : 'mse',

                              'second' : 'categorical_crossentropy'

                              'third' : 'binary_crossentropy} )

#compile 메소드에 리스트나 딕셔너리를 사용하여 다른 손실을 지정할 수 있다.

손실값에 가중치를 부여하여 최종 손실에 기여하는 수준을 정할 수도 있다.

 

층으로 구성된 비순환 유향 그래프

함수 API를 사용하여 비순환 유향 그래프(Directed acyclic graph)

텐서 x가 자기 자신을 출력하는 층의 입력이 될 수 없다.

 

인셉션 모듈

인셉션(Inception)은 합성곱 신경망에서 인기있는 네트워크 구조이다.

네트워크 안의 네트워크 구조이다.

나란히 분리된 가지를 따라 모듈을 쌓아 독집된 작은 네트워크처럼 구성한다.(3~4개)

 

엑셉션 모듈

엑셉션(Xception)은 극단적인 인셉션 모듈을 깊이별 분리 합성곱으로 바꾼다.

깊이별 합성곱 다음에 점별 함성곱(1 x 1)이 뒤따른다.

공간 특성과 채널 방향 특성을 완전히 분리한다고 생각하면 된다.

 

잔차 연결

전차 연결(residual connection)은 많은 네트워크 구조에 있는 그래프 형태의 네트워크 컴포넌트이다.

그래디언트 소실표현 병목을 해결한다.

일반적으로 10개층 이상을 가진 모델에 잔차연결을 추가하면 도움이된다.

하위 층의 출력이 상위 층의 활성화 출력에 연결되는 것이 아니라 더해진다.

표현 병목

하위층의 정보를 다시 주입하여 손실된 정보를 줄인다.

 

층 가중치 공유

함수형 API의 하나의 기능은 객체를 여러 번 재사용 할수 있다는 것이다.

층 객체를 두 번 호출하면 새로운 층 객체를 만들지 않고 각 호출에 동일한 가중치를 재사용한다.

 

샴 LSTM / 공유 LSTM

각입력 문장을 처리하는 2개의 독립된 모델을 학습하는 것은 비효율이다. 따라서 하나의 LSTM 층으로 양쪽을 모두

처리하는 것이 좋다. 이 LSTM층의 표현은 두 입력에 대해 함께 학습된다.

 

층과 모델

함수형 API에선 모델을 층처럼 사용할 수 있다.

모델 객체를 호출할 때, 모델의 가중치가 재사용 된다.

케라스 콜백과 텐서보드 사용

model.fit( callbacks = callbacks_list )

#list로 만들어 던저준다.

콜백

모델의 fit() 메소드가 호출될 때, 전달되는 객체이다.

모델의 상태와 성능에 대한 모든 정보에 접근하고, 훈련을 중지하거나 모델을 저장, 가중치 적재 또는 

모델 상태 변경을 처리할 수 있다.

  • 모델 체크포인트 저장 : 훈련 동안 특정 지점의 현재 가중치를 저장한다.
  • 조기 종료(early stopping) : 검증 손실이 향상되지 않으면 훈련을 중지한다.
  • 하이퍼 파라미터값 동적 조정 : 옵티마이저의 학습률 같은 경우
  • 학습에 관련 시각화 

ModelCheckpoint와 Early Stopping 콜백

Early stopping 콜백을 사용하면 에포크 동안 지표가 향상되지 않을 때, 훈련을 중지한다.

ModelCheckpoint 콜백은 훈련하는 동안 모델을 계속 저장해준다.

두 콜백은 함께 쓰인다.

 

ReduceLROnPlateau 콜백

검증 손실이 향상되지 않을 때, 학습률을 작게 할 수 있다.

손실 곡선이 평탄할 때, 학습률을 작게 하거나 크게 하면 훈련 도중 지역 최솟값에서 효과적으로 빠져나올 수 있다.

 

자신만의 콜백 만들기

keras.callbacks.Callback 클래스를 상속받아서 구현한다.

 

텐서보드 : 텐서플로의 시각화 프레임 워크

  • 훈련하는 동안 측정 지표를 시각적으로 모니터링 한다
  • 모델 구조를 시각화한다
  • 활성화 출력과 그레디언트의 히스토그램을 그린다
  • 3D로 임베딩을 표현한다

모델 성능 최대로 끌어올리기

정규화와 깊이별 분리 합성곱을 이용하여 고성능 심층 컨브넷을 만든다.

 

배치 정규화

정규화(nomalization)는 머신러닝 모델에 주입되는 샘플들을 균일하게 만드는 광범위한 방법

모델이 학습하고 새로운 데이터에 잘 일반화되도록 돕는다.

 

배치 정규화는 BatchNormalization 클래스로 제공된다.

훈련하는 동안 평균과 분산이 바뀌더라도 이에 적응하여 데이터를 정규화 한다.

배치 정규화는 잔차 연결처럼 그래디언트의 전파를 도와주는 것이다.

 

BatchNormalization 층은 일반적으로 합성곱이나 완전 연결층 다음에 사용된다.

# axis 축이 존재한다. 기본 값은 입력 텐서의 마지막 축 -1을 의미한다. 하지만

channels_first로 사용하는 경우 특성축은 1이다.

 

깊이별 분리 합성곱

깊이별 분라 합성곱(depthwise separable convolution)층은 입력 채널별로 따로따로 공간 방향의 합성곱을 수행한다.

점별 합성곱(1 x 1 합성곱)을 통해 출력 채널을 합친다. 이는 공간 특성의 학습과 채널 방향 특성의 학습을 분리하는 효과를 보여준다.

model.add( layers.SeparableConv2D( filter, masksize, activation = 'function')

 

하이퍼 파라미터 최적화 - 구조에 관련된 파라미터

  • 일련의 하이퍼 파라미터를 선택한다
  • 선택된 하이퍼파라미터로 모델을 만든다
  • 훈련 데이터에 학습하고 검증 데이터에서 최종 성능을 측정한다
  • 다음 하이퍼 파라미터를 선택한다
  • 이 과정을 반복한다
  • 마지막으로 테스트 데이터에서 성능을 측정한다

파라미터를 선택하는 알고리즘

  • 베이지안 최적화(bayesian optimization)
  • 유전 알고리즘(genetic algorithms)
  • 간단한 랜덤 탐색(random search)

모델 앙상블(model ensemble)

여러 개 다른 모델의 예측을 합쳐서 더 좋은 예측을 만든다.

분류기 예측을 앙상블 하기 위해선 추론할 때 나온 예측을 평균 내는 것이다.

가중평균을 찾아서 적용하는 것도 좋다.

 

좋은 앙상블 가중치를 찾기위해 랜덤 서치넬더-미드 방법등이 있다.

 

반응형

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

[케라스 Chapter9정리]  (0) 2020.02.24
[케라스 Chapter8 정리]  (0) 2020.02.23
[케라스 Chapter6 정리]  (0) 2020.02.11
[케라스 Chapter5 정리]  (0) 2020.01.31
[케라스 Chapter4 정리]  (0) 2020.01.28
Comments