<함수형 API>
1. 다중입력모델
전형적 예) 질문 -응답 모델 : 2개의 입력(자연어 질문, 답변에 필요한 텍스트 정보, concatenate로 연결하기! ) -> 응답 (소프트맥스를 통해 한 단어로 답을 추출)
2개의 입력값을 어떻게 훈련시킬까?
첫번째 방식, 넘파이 배열의 리스트
두번째 방식, 이름과 넘파이 배열의 딕셔너리 (물론, 이름 정보가 있어야지)
2. 다중출력모델
전형적 예) 데이터를 토해 여러 속성들을 예측하기
훈련하려면? 네트워크 출력마다 다른 손실함수 지정. 손실값을 하나로 합치는 가장 간단한 방법은 더하기!
* MSE(평균제곱오차)
만약 손실값이 불균형하면? 손실 가중치주기!(즉. 스케일이 다를때 유용). loss_weight
3. 비순환 유향 그래프
가장 유명한 네트워크 컴포넌트: 인셉션 모듈 & 잔차연결 이용하기!
* 인셉션 모듈 : 네트워크 안의 네트워크
3~4개의 가지. 1*1 합성곱에서 3*3합성곱이 뒤따름. 마지막에 가지들의 출력을 합친다. concatenate
더 복잡한 경우? 풀링 연산, 여러가지 합성곱 사이즈(5*5). 공간 합성곱이 없는 경우로만 구성(1*1)
- 1*1 합성곱의 목적?
인셉션V3 ( keras.applications.inception_v3.InceptionV3 )
엑셉션 :
인셉션과 엑셉션 비교? 인셉션V3와 거의 동일한 개수의 모델 파라미터를 가지지만 실행속도가 더 빠르고 정확도가 더 높다. 모델 파라미터를 더 효율적으로 사용했기 때문
* 잔차연결 : 상위층의 출력 텐서에 더해서 아래층의 표현이 네트워크 위쪽으로 흘러갈수있도록 한다. 하위층에서 학습된 정보가 데이터 처리 과정에서 손실되는 것을 방지. 표현병목과 그래디언트 소실문제에 유용
* 표현병목 :
예) 1단계 -> 2단계 -> 3단계 -> 3단계 출력값과 1단계 출력값을 더하기. 즉 순서대로 놓인 네트워크를 질러가는 연결이 만들어짐! 더해야하기 때문에 크기가 같아야해(선형변환 이용)
일반적으로 10개층이상을 가진 모델에 잔차연결을 추가하면 도움이 됨!
4. 층 가중치 공유
샴 LSTM, 공유LSTM
<요약>
1. 차례대로 층 쌓는것 이상이 필요할때 sequentialAPI 사용안함
2. 함수형 API를 사용하여 다중입력, 다중출력, 복잡한 네트워크 토폴로지를 갖는 케라스 모델
3. 다른 네트워크 가지에서 같은 층이나 모델 객체를 여러번 호출하여 가중치를 재사용하는 방법
--------------------------------------------------------------------------------------------
1. 콜백을 사용하여 모델의 훈련과정 제어하기
-모델 체크포인트 지정
-조기 종료
-훈련하는 동안 하이퍼파라미터 값 동적으로 조정
-훈련과 검증 지표를 로그에 기록하거나 모델이 학습한 표현이 업데이트될때마다 시각화!
<대표적 예>
- keras.callbacks.ModelCheckpoint : 선택적으로 지금까지 가장 좋은 모델만 저장. 즉, 에포크 마지막에 다다랐을때 최고성능을 달성한 모델
keras.callbacks.EarlyStopping : 정해진 에포크동안 모니터링 지표가 향상되지 않으면 멈춤. 즉 과대적합이 발생하면 멈춤.
주로 ModelCheckpoint 와 EarlyStopping 같이사용
- keras.callbacks.ReduceLROnPlateau : 검증손실이 향상되지 않을때 학습률을 작게할수있어. 즉 지역최솟값에서 효과적으로 빠져나올수있어
keras.callbacks.LearningRateScheduler
keras.callbacks.CSVLogger
<자신만의 콜백 만들기>
keras.callbacks.Callback 클래스 상속 예) class test(keras.callbacks.Callback)
-on_epoch_begin : 각 에포크가 시작할 때 호출
-on_epoch_end : 각 에포크가 끝날때 호출
-on_batch_begin : 각 배치 처리가 시작되기 전 호출
-on_batch_end : 각 배치 처리가 끝난후 호출
-on_train_begin : 훈련이 시작될때 호출
-on_train_end : 훈련이 끝날때 호출
이 메서드들은 모두 logs매개변수와 함께 호출. 이 매개변수는 이전 배치, 에포크에 대한 훈련과 검증측정값이 담긴 딕셔너리가 전달됨
-self.model
-self.validation_data : fit메서드 전달된 검증 데이터
<텐서보드> 브라우저 기반 시각화 도구. 텐서플로를 설치했다면 텐서보드 유틸리티는 자동으로 설치됨.
keras.callbacks.TensorBoard
그외에도 keras.utils.plot_model : 모델의 층 그래프를 그려주는 기능 (pydot. pydot-ng. graphviz 라이브러리 필요)
------------------------------------------------------------------------------------------------------
<고급 구조 패턴>
1. 배치 정규화 : 주입되는 샘플을 균일하게 만드는 것.
-정규 분포 : 데이터에서 평균을 빼서 데이터를 원점으로 맞추고 표준편차로 나누어 데이터의 분산을 1로 만든다.
-데이터 정규화는 네트워크에서 일어나는 모든 변환후에도 고려해야 함. 평균이 0이고 편차가 1이어도 출력되는 데이터가 동일한 분포를 가질것이라고 기대할 수 없기 때문. 잔차연결과 매우 흡사하게 그래디언트의 전파를 도움. 결국 더 깊은 네트워크를 구성할 수 있음.
매우 깊은 네트워크란? 여러개의 BatchNormalization 층을 포함해야 훈련할 수 있어. 일반적으로 합성곱이나 완전 연결층 다음에 사용한다.
ResNet50, 인셉션V3, 엑셉션 등
<BatchNormalization 클래스> 정규화할 특성축 axis 매개변수가 존재. 이 매개변수의 기본값은 입력 텐서의 마지막 축을 나타내는 -1.
-data_format
"channels_last" 설정 : Dense, Conv1D, RNN, Conv2D -> -1
"channels_first" 설정: 특성축 axis 매개변수 값 =1
* 배치 재정규화
추가적인 비용 들지않고 배치 정규화보다 이득이 많아. 특정활성화 함수(selu), 초기화방법(lecun_normal) 사용한 Dense층의 출력을 정규화한다. 현재 완전 연결 네트워크에만 제한되어 있어 널리 사용되지 못하고 있음.
2. 깊이별 분리 합성곱
- SeparableConv2D
입력채널별로 공간방향의 합성곱 수행-> 점별합성곱(1*1) 통해 출력채널 합친다.
즉, 공간특성의 학습과 채널 방향 특성의 학습을 분리하는 효과. 입력에서 공간상 위치는 상관관계가 크지만 채널별로 매우 독립적이라고 가정한다면 타당하다.
장점: 제한된 데이터로 작은 모델을 처음부터 훈련시킬때 특히 더중요. 성능 더 높은 모델을 만든다.
* 고성능 컨브넷인 엑셉션 구조의 기반으로 깊이별 분리 합성곱이 사용된 사례 참고하길.
3. 하이퍼파라미터 최적화
구조와 관련된 파라미터를 역전파로 훈련되는 모델 파라미터와 구분하여 하이퍼파라미터라고 부른다.