Path: blob/master/site/ko/guide/keras/preprocessing_layers.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
전처리 레이어 처리
Keras 전처리
개발자는 Keras 전처리 레이어 API를 사용하여 Keras 네이티브 입력 처리 파이프라인을 구축할 수 있습니다. 이러한 입력 처리 파이프라인은 Keras가 아닌 워크플로에서 독립적인 전처리 코드로 사용할 수 있고, Keras 모델과 직접 결합하고, Keras SavedModel의 일부로 내보낼 수 있습니다.
Keras 전처리 레이어를 사용하여 진정한 엔드 투 엔드 모델을 구축하고 내보낼 수 있으며, 이러한 모델에는 원시 이미지 또는 구조화된 원시 데이터를 입력으로 받아들이는 모델, 기능 정규화 또는 기능 값 인덱싱을 자체적으로 처리하는 모델이 있습니다.
사용할 수 있는 전처리
텍스트 전처리
tf.keras.layers.TextVectorization
: 원시 문자열을Embedding
레이어 또는Dense
레이어에서 읽을 수 있는 인코딩 표현으로 바꿉니다.
숫자 기능 전처리
tf.keras.layers.Normalization
: 입력 기능의 기능별 정규화를 수행합니다.tf.keras.layers.Discretization
: 연속 숫자 기능을 정수 범주형 기능으로 바꿉니다.
범주형 기능 전처리
tf.keras.layers.CategoryEncoding
: 정수 범주형 기능을 원-핫(one-hot), 멀티-핫(multi-hot) 또는 카운트 밀집 표현(count dense representations)으로 바꿉니다.tf.keras.layers.Hashing
: "해싱 트릭(hashing trick)"이라 불리우는 범주형 기능 해싱을 수행합니다.tf.keras.layers.StringLookup
: 문자열 범주를Embedding
레이어 또는Dense
레이어에서 읽을 수 있는 인코딩 표현으로 바꿉니다.tf.keras.layers.IntegerLookup
: 정수 범주를Embedding
레이어 또는Dense
레이어에서 읽을 수 있는 인코딩 표현으로 바꿉니다.
이미지 전처리
이미지 모델 입력을 표준화하기 위한 레이어입니다.
tf.keras.layers.Resizing
: 이미지 배치의 크기를 대상 크기로 조정합니다.tf.keras.layers.Rescaling
: 이미지 배치의 값을 재조정하고 오프셋합니다(예:[0, 255]
범위의 입력에서[0, 1]
범위의 입력으로 이동).tf.keras.layers.CenterCrop
: 이미지 배치의 가운데 크롭을 반환합니다.
이미지 데이터 증강
이 레이어는 이미지 배치에 무작위 증강 변환을 적용합니다. 이러한 작업은 훈련 중에만 활성화됩니다.
tf.keras.layers.RandomCrop
tf.keras.layers.RandomFlip
tf.keras.layers.RandomTranslation
tf.keras.layers.RandomRotation
tf.keras.layers.RandomZoom
tf.keras.layers.RandomHeight
tf.keras.layers.RandomWidth
tf.keras.layers.RandomContrast
adapt()
메서드
일부 전처리 레이어에는 훈련 데이터의 샘플을 기반으로 계산할 수 있는 내부 상태가 있습니다. 상태 저장 전처리 레이어 목록은 다음과 같습니다.
TextVectorization
: 문자열 토큰과 정수 인덱스 간의 매핑을 유지합니다.StringLookup
및IntegerLookup
: 입력 값과 정수 인덱스 간의 매핑을 유지합니다.Normalization
: 기능의 평균과 표준편차를 유지합니다.Discretization
: 값 버킷 경계에 대한 정보를 유지합니다.
결정적으로 이러한 레이어는 훈련할 수 없습니다. 이들의 상태는 훈련 중에 설정되지 않습니다. 미리 계산된 상수로부터 초기화하거나 데이터에 "적용"하는 방식을 사용하여 훈련하기 전에 설정해야 합니다.
다음과 같이 adapt()
메서드를 통해 학습 데이터에 노출하여 전처리 레이어의 상태를 설정할 수 있습니다.
adapt()
메소드는 Numpy 배열 또는 tf.data.Dataset
객체를 사용합니다. StringLookup
및 TextVectorization
의 경우, 문자열의 목록을 전달할 수도 있습니다.
또한, 적응 가능한 레이어는 항상 생성자 인수 또는 가중치 할당을 통해 상태를 직접 설정하는 옵션을 제공합니다. 의도한 상태 값이 레이어 생성 시 알려지거나 adapt()
호출 외부에서 계산되는 경우, 레이어의 내부 계산에 의존하지 않고 설정할 수 있습니다. 예를 들어, TextVectorization
, StringLookup
또는 IntegerLookup
레이어에 대한 외부 어휘 파일이 이미 있는 경우, 레이어의 생성자 인수에 있는 어휘 파일에 대한 경로를 전달하여 조회 테이블에 직접 로드할 수 있습니다.
다음은 사전 계산된 어휘로 StringLookup
레이어를 인스턴스화하는 예입니다.
모델 이전 또는 모델 내부에서의 데이터 전처리
전처리 레이어를 사용할 수 있는 두 가지 방법이 있습니다.
옵션 1: 다음과 같이 모델의 일부로 만듭니다.
이 옵션을 사용하면 나머지 모델 실행과 동시에 장치에서 전처리가 발생하므로 GPU 가속의 이점을 얻을 수 있습니다. GPU로 훈련을 진행하는 경우 Normalization
레이어와 모든 이미지 전처리 및 데이터 강화 레이어에 이 옵션이 가장 적합합니다.
옵션 2: tf.data.Dataset
에 이 옵션을 적용하면 다음과 같이 전처리된 데이터 배치를 생성하는 데이터세트를 얻습니다.
이 옵션을 사용하면 전처리가 CPU에서 비동기적으로 발생하고 모델에 들어가기 전에 전처리가 버퍼링됩니다. 추가적으로 데이터세트에서 dataset.prefetch(tf.data.AUTOTUNE)
를 호출하면 사전처리가 훈련과 병행하게 효율적으로 이루어집니다.
이는 TextVectorization
및 모든 구조화된 데이터 전처리 레이어에 가장 적합한 옵션입니다. CPU로 훈련하고 이미지 전처리 레이어를 사용하는 경우에도 좋은 옵션이 될 수 있습니다.
TPU에서 실행할 경우 항상 tf.data
파이프라인에 전처리 레이어를 배치해야 합니다(TPU에서 잘 실행되고 일반적으로 첫 번째 레이어를 이미지 모델로 사용하는 Normalization
및 Rescaling
은 제외).
추론 시 모델 내에서 전처리를 수행할 때의 이점
옵션 2를 사용하더라도 나중에 전처리 레이어를 포함하는 추론 전용 엔드 투 엔드 모델을 내보낼 수 있습니다. 이 작업의 주요 이점은 모델을 이식 가능하게 만들고 **훈련/적용 편향**을 줄이는 데 도움이 된다는 것입니다.
모든 데이터 전처리가 모델의 일부인 경우, 다른 사람들은 각 특성이 어떻게 인코딩되고 정규화될 것으로 예상되는지 알 필요 없이 모델을 로드하고 사용할 수 있습니다. 추론 모델은 원시 이미지 또는 원시 구조적 데이터를 처리할 수 있으며, 모델 사용자가 예를 들어, 텍스트에 사용되는 토큰화 체계, 범주형 특성에 사용되는 인덱싱 체계, 이미지 픽셀 값이 [-1, +1]
또는 [0, 1]
로 정규화되었는지 여부와 같은 세부 정보를 알 필요가 없습니다. 이는 모델을 TensorFlow.js와 같은 다른 런타임으로 내보내는 경우 특히 강력합니다. JavaScript에서 전처리 파이프라인을 다시 구현할 필요가 없습니다.
처음에 전처리 레이어를 tf.data
파이프라인에 배치한 경우, 전처리를 패키징하는 추론 모델을 내보낼 수 있습니다. 전처리 레이어와 훈련 모델을 연결하는 새 모델을 인스턴스화하기만 하면 됩니다.
퀵 레시피
이미지 데이터 증강
이미지 데이터 증강 레이어는 훈련 중에만 활성화됩니다(Dropout
레이어와 유사).
처음부터 이미지 분류하기 예제에서 유사한 설정이 동작하는 것을 볼 수 있습니다.
수치 특성 정규화하기
원-핫 인코딩을 통해 문자열 범주형 특성 인코딩하기
여기에서 인덱스 0은 어휘 이외의 값(adapt()
동안 표시되지 않은 값)을 위해 예약되어 있습니다
구조화된 데이터 분류 처음부터 하기 예시에서 작동 중인 StringLookup
을 볼 수 있습니다.
원-핫 인코딩을 통해 정수 범주형 특성 인코딩하기
인덱스 0은 누락된 값(값을 0으로 지정해야 함)용으로 예약되어 있고 인덱스 1은 어휘 외 의값(adapt()
동안 표시되지 않은 값)용으로 예약되어 있습니다. IntegerLookup
의 mask_token
및 oov_token
생성자 인수를 사용하여 이를 구성할 수 있습니다.
구조화된 데이터 분류 처음부터 하기 예시에서 작동 중인 IntegerLookup
을 볼 수 있습니다.
정수 범주형 특성에 해싱 트릭 적용하기
여러 다른 값(10e3 이상)을 사용할 수 있는 범주형 특성의 각 값이 데이터에서 몇 번만 나타나는 경우, 특성 값을 인덱싱하고 원-핫 인코딩하는 것은 비실용적이고 비효율적입니다. 대신, "해싱 트릭"을 적용하는 것이 좋습니다. 값을 고정된 크기의 벡터로 해싱합니다. 이는 특성 공간의 크기를 관리 가능한 상태로 유지하고 명시적 인덱싱의 필요성을 제거합니다.
일련의 토큰 인덱스로 텍스트 인코딩하기
Embedding
레이어에 전달될 텍스트를 전처리하는 방법입니다.
처음부터 텍스트 분류 예에서 Embedding
모드와 결합된 TextVectorization
레이어가 동작하는 것을 볼 수 있습니다.
이러한 모델을 훈련할 때에는 최상의 성능을 위해 TextVectorization
레이어를 입력 파이프라인의 일부로 사용해야 합니다.
멀티-핫 인코딩을 사용하여 텍스트를 ngram의 밀집 행렬로 인코딩하기
다음은 Dense
레이어로 전달될 텍스트를 전처리하는 방법입니다.
TF-IDF 가중치를 사용하여 텍스트를 ngram의 밀집 행렬로 인코딩하기
다음은 Dense
레이어로 전달하기 전에 텍스트를 전처리하는 또 다른 방법입니다.
중요 정보
매우 방대한 어휘를 보유한 룩업(lookup) 레이어로 작업 수행하기
TextVectorization
, StringLookup
레이어 또는 IntegerLookup
레이어에서 매우 방대한 어휘로 작업해야 하는 경우가 있을 수 있습니다. 일반적으로 500MB보다 큰 어휘는 "매우 큰" 것으로 간주합니다.
이러한 경우 최상의 성능을 위해 adapt()
사용을 피해야 합니다. 대신 사전에 어휘를 미리 계산하고(이를 위해 Apache Beam 또는 TF Transform을 사용할 수 있음) 이를 파일에 저장합니다. 그런 다음 파일 경로를 vocabulary
인수로 전달하여 구성하는 시점에 어휘를 레이어에 로드합니다.
TPU 포드에서 또는 ParameterServerStrategy
로 룩업(lookup) 레이어 사용하기
TPU 포드 또는 여러 기기에서 ParameterServerStrategy
를 사용하여 훈련을 진행하는 동안 TextVectorization
, StringLookup
또는 IntegerLookup
을 사용할 경우 성능을 저하시키는 미해결 문제가 있습니다. 이는 TensorFlow 2.7에서 수정될 예정입니다.