1. 개요
이 실습에서는 Keras 분류기를 빌드하는 방법을 알아봅니다. 꽃을 인식하기 위한 신경망 레이어의 완벽한 조합을 알아내는 대신 먼저 이전 학습이라는 기술을 사용하여 강력한 사전 학습된 모델을 데이터 세트에 맞게 조정합니다.
이 실습에는 신경망에 관한 필요한 이론적 설명이 포함되어 있으며, 딥 러닝을 배우는 개발자가 이 실습을 시작하기에 좋은 출발점이 될 것입니다.
이 실습은 'TPU 기반 Keras' 시리즈의 2부입니다. 다음 순서대로 수행하거나 개별적으로 수행할 수 있습니다.
- TPU 속도 데이터 파이프라인: tf.data.Dataset 및 TFRecords
- [이 실습] 전이 학습을 사용한 첫 번째 Keras 모델
- Keras와 TPU를 사용한 컨볼루셔널 신경망
- Keras 및 TPU를 사용한 최신 Convnet, Squeezenet, Xception
학습할 내용
- 소프트맥스 레이어와 교차 엔트로피 손실로 자체 Keras 이미지 분류기를 빌드합니다.
- 자체 모델을 빌드하는 대신 이전 학습을 사용하여 속이는 😈 방법입니다.
의견
이 Codelab에 문제가 있는 경우 알려주세요. 의견은 GitHub 문제[의견 링크]를 통해 제공할 수 있습니다.
2. Google Colaboratory 빠른 시작
이 실습에서는 Google Collaboratory를 사용하므로 사용자가 별도로 설정할 필요가 없습니다. Colaboratory는 교육 목적을 위한 온라인 노트북 플랫폼입니다. 무료 CPU, GPU, TPU 학습을 제공합니다.
이 샘플 노트북을 열고 몇 개의 셀을 실행하여 Colaboratory를 익힐 수 있습니다.
TPU 백엔드 선택
Colab 메뉴에서 런타임 > 런타임 유형 변경을 선택한 후 TPU를 선택합니다. 이 Codelab에서는 하드웨어 가속 학습에 지원되는 강력한 TPU (Tensor Processing Unit)를 사용합니다. 런타임에 대한 연결은 첫 실행 시 자동으로 이루어지며, 오른쪽 상단의 '연결' 버튼을 사용해도 됩니다.
노트북 실행
셀을 클릭하고 Shift-Enter를 사용하여 셀을 한 번에 하나씩 실행합니다. 런타임 > 모두 실행에서 전체 노트북을 실행할 수도 있습니다.
목차
모든 노트북에는 목차가 있습니다. 왼쪽의 검은색 화살표를 사용하여 열 수 있습니다.
숨겨진 셀
일부 셀에는 제목만 표시됩니다. 이 기능은 Colab 전용 노트북 기능입니다. 더블클릭하여 내부 코드를 볼 수 있지만 일반적으로 그다지 흥미롭지 않습니다. 일반적으로 지원 또는 시각화 함수입니다. 내부의 함수를 정의하려면 이러한 셀을 실행해야 합니다.
인증
승인된 계정으로 인증하면 Colab에서 비공개 Google Cloud Storage 버킷에 액세스할 수 있습니다. 위의 코드 스니펫은 인증 프로세스를 트리거합니다.
3. [INFO] 신경망 분류 101
요약
다음 단락의 굵은 글꼴로 표시된 모든 용어를 이미 알고 있다면 다음 연습문제로 이동하세요. 딥 러닝을 이제 막 시작했다면 환영하며, 계속 읽어 보시기 바랍니다.
레이어의 시퀀스로 빌드된 모델의 경우 Keras는 Sequential API를 제공합니다. 예를 들어 3개의 촘촘한 레이어를 사용하는 이미지 분류기는 Keras에서 다음과 같이 작성할 수 있습니다.
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )
고밀도 신경망
이는 이미지를 분류하는 가장 간단한 신경망입니다. 레이어로 정렬된 '뉴런'으로 이루어져 있습니다. 첫 번째 레이어는 입력 데이터를 처리하고 그 출력을 다른 레이어에 제공합니다. 각 뉴런이 이전 레이어의 모든 뉴런과 연결되어 있기 때문에 이를 '밀집'이라고 합니다.
모든 픽셀의 RGB 값을 긴 벡터로 평면화하고 입력으로 사용하여 이미지를 이러한 네트워크에 피드할 수 있습니다. 영상 인식에 가장 적합한 기술은 아니지만 추후 개선하겠습니다.
뉴런, 활성화, RELU
'뉴런'은 모든 입력의 가중 합계를 계산하고 '바이어스'라는 값을 더한 후 '활성화 함수'를 통해 결과를 제공합니다. 가중치와 편향은 처음에는 알 수 없습니다. 이러한 가중치는 무작위로 초기화되고 많은 양의 알려진 데이터로 신경망을 학습하여 '학습'됩니다.
가장 인기 있는 활성화 함수는 정류 선형 유닛의 약자인 RELU입니다. 위의 그래프에서 볼 수 있듯이 매우 간단한 함수입니다.
소프트맥스 활성화
위의 네트워크는 꽃을 5가지 카테고리(장미, 튤립, 민들레, 데이지, 해바라기)로 분류하므로 5개 뉴런 레이어로 끝납니다. 중간 레이어의 뉴런은 클래식 RELU 활성화 함수를 사용하여 활성화됩니다. 하지만 마지막 레이어에서는 이 꽃이 장미나 튤립일 확률을 나타내는 0과 1 사이의 숫자를 계산하려고 합니다. 이를 위해 '소프트맥스'라는 활성화 함수를 사용합니다.
벡터에 소프트맥스를 적용하는 방법은 각 요소의 지수를 취한 다음 벡터를 정규화하는 것입니다. 일반적으로 L1 norm(절대값의 합)을 사용하여 값이 합계 1이 되고 확률로 해석될 수 있도록 합니다.
교차 엔트로피 손실
이제 신경망이 입력 이미지에서 예측을 생성했으므로 예측의 정확성을 측정해야 합니다. 즉, 신경망이 알려주는 값과 올바른 답변(흔히 '라벨'이라고 함) 사이의 거리를 측정해야 합니다. 데이터 세트의 모든 이미지에 올바른 라벨이 있다는 점을 기억하세요.
어떤 거리도 사용할 수 있지만 분류 문제의 경우 소위 '교차 엔트로피 거리'가 가장 효과적입니다. 이를 오류 함수 또는 '손실' 함수라고 부르겠습니다.
경사하강법
신경망을 '학습'시킨다는 것은 실제로 학습 이미지와 라벨을 사용하여 교차 엔트로피 손실 함수를 최소화하기 위해 가중치와 편향을 조정하는 것을 의미합니다. 작동 원리는 다음과 같습니다.
교차 엔트로피는 학습 이미지의 가중치, 편향, 픽셀 및 알려진 클래스의 함수입니다.
모든 가중치와 모든 편향에 대해 교차 엔트로피의 부분 미분을 계산하면 주어진 이미지, 라벨, 가중치 및 편향의 현재 값에 대해 계산된 '기울기'를 얻습니다. 수백만 개의 가중치와 편향이 있을 수 있으므로 기울기를 계산하려면 엄청난 노력이 필요합니다. 다행히 TensorFlow에서 이 작업을 대신해 줍니다. 그라데이션의 수학적 특성은 '위쪽'을 향한다는 것입니다. 교차 엔트로피가 낮은 지점으로 이동하려고 하므로 반대 방향으로 이동합니다. 가중치와 편향은 경사의 비율로 업데이트합니다. 그런 다음 학습 루프에서 다음 학습 이미지 및 라벨 배치를 사용하여 동일한 작업을 반복해서 수행합니다. 이 경우 교차 엔트로피가 최소 수준인 지점으로 연결되길 바라지만 이 최솟값이 고유하다는 것을 보장하지는 않습니다.
미니 배치 및 모멘텀
예시 이미지 한 개에 대해서만 경사를 계산하고 가중치와 편향을 즉시 업데이트할 수 있지만, 예를 들어 128개 이미지 배치에서는 그라데이션이 적용되어 서로 다른 예시 이미지가 주는 제약 조건을 더 잘 표현하는 그라데이션이 제공되므로 솔루션을 향해 더 빠르게 수렴할 수 있습니다. 미니 배치의 크기는 조정 가능한 매개변수입니다.
'확률적 경사 하강'이라고도 하는 이 기법에는 또 다른 실용적인 이점이 있습니다. 일괄 처리를 사용하면 더 큰 행렬을 사용할 수 있으며, 이러한 행렬은 일반적으로 GPU 및 TPU에서 더 쉽게 최적화할 수 있습니다.
하지만 수렴은 여전히 약간 혼란스러울 수 있으며 경사 벡터가 모두 0이면 멈출 수도 있습니다. 최솟값을 찾은 것인가요? 항상 그렇지는 않습니다. 그라데이션 구성요소는 최솟값이나 최댓값이 0일 수 있습니다. 수백만 개의 요소가 있는 경사 벡터에서 요소가 모두 0인 경우 모든 0이 최솟값에 해당하고 어느 것도 최댓값에 해당하지 않을 확률은 매우 작습니다. 여러 차원의 공간에서 안장점은 매우 일반적이며 여기서 멈추고 싶지 않습니다.
삽화: 안장점 기울기는 0이지만 모든 방향에서 최솟값이 아닙니다. (이미지 저작자 표시 위키미디어: Nicoguaro님 작성 - 자체 제작, CC BY 3.0)
해결책은 최적화 알고리즘에 모멘텀을 더하여 멈추지 않고 새들 지점을 지날 수 있도록 하는 것입니다.
용어집
배치 또는 미니 배치: 학습은 항상 학습 데이터 및 라벨의 배치에서 실행됩니다. 이렇게 하면 알고리즘이 수렴되는 데 도움이 됩니다. '배치' 차원은 일반적으로 데이터 텐서의 첫 번째 차원입니다. 예를 들어 모양이 [100, 192, 192, 3]인 텐서에는 픽셀당 3개의 값(RGB)이 있는 192x192픽셀의 이미지 100개가 포함됩니다.
교차 엔트로피 손실: 분류기에서 자주 사용되는 특수한 손실 함수입니다.
밀집 레이어: 각 뉴런이 이전 레이어의 모든 뉴런과 연결되는 뉴런 레이어입니다.
특성: 신경망의 입력을 '특성'이라고도 합니다. 좋은 예측을 하기 위해 데이터 세트의 어떤 부분 (또는 부분의 조합)을 신경망에 입력해야 하는지 알아내는 기술을 '특성 추출'이라고 합니다.
라벨: 감독 분류 문제에서 '클래스' 또는 정답의 다른 이름
학습률: 학습 루프의 각 반복에서 가중치와 편향이 업데이트되는 경사의 비율입니다.
로지트: 활성화 함수가 적용되기 전의 뉴런 레이어의 출력을 '로지트'라고 합니다. 이 용어는 '로지스틱 함수'(일명 '시그모이드 함수')에서 유래한 것으로 가장 널리 사용되었던 활성화 함수였습니다. '로지스틱 함수 이전의 뉴런 출력'이 '로지트'로 축약되었습니다.
loss: 신경망 출력을 정답과 비교하는 오류 함수
뉴런: 입력의 가중 합계를 계산하고 편향을 추가한 후 활성화 함수를 통해 결과를 제공합니다.
원-핫 인코딩: 5개 중 3번째 클래스는 5개 요소의 벡터로 인코딩되며, 3번째 요소를 제외한 모든 요소는 0입니다.
relu: 정류 선형 유닛입니다. 뉴런에 많이 사용되는 활성화 함수입니다.
sigmoid: 예전에 인기가 있었고 특수한 경우에 여전히 유용한 다른 활성화 함수입니다.
소프트맥스: 벡터에서 작동하고, 가장 큰 구성요소와 다른 구성요소 간의 차이를 늘리고, 확률 벡터로 해석될 수 있도록 벡터를 합계가 1이 되도록 정규화합니다. 분류기의 마지막 단계로 사용됩니다.
텐서: '텐서'는 행렬과 비슷하지만 차원이 임의 개수일 수 있습니다. 1차원 텐서는 벡터입니다. 2차원 텐서는 행렬입니다. 그런 다음 3차원, 4차원, 5차원 또는 그 이상의 차원을 가진 텐서를 사용할 수 있습니다.
4. 전이 학습
이미지 분류 문제의 경우 밀집 레이어로는 충분하지 않을 수 있습니다. 컨볼루셔널 레이어와 이를 정렬할 수 있는 다양한 방법을 배워야 합니다.
하지만 바로가기를 사용할 수도 있습니다. 완전히 학습된 컨볼루셔널 신경망을 다운로드할 수 있습니다. 마지막 레이어인 소프트맥스 분류 헤드를 잘라내고 자체 레이어로 대체할 수 있습니다. 학습된 모든 가중치와 편향은 그대로 유지되며 추가한 softmax 레이어만 다시 학습합니다. 이 기법을 전이 학습이라고 하며 신경망이 선행 학습된 데이터 세트가 사용자의 데이터 세트에 '충분히 가까이' 있을 때만 작동합니다.
실습
다음 노트북을 열고 셀을 실행(Shift-Enter)한 후 '작업 필요' 라벨이 표시되는 곳에서 안내를 따르세요.
Keras Flowers transfer learning (playground).ipynb
추가 정보
전이 학습을 사용하면 업계 최고의 연구원들이 개발한 고급 컨볼루션 신경망 아키텍처와 대규모 이미지 데이터 세트에서의 사전 학습의 이점을 모두 누릴 수 있습니다. 이 경우 꽃과 매우 유사한 많은 식물과 야외 장면이 포함된 이미지 데이터베이스인 ImageNet에서 학습된 네트워크에서 학습 내용을 전송합니다.
그림: 이미 학습된 복잡한 컨볼루셔널 신경망을 블랙박스로 사용하여 분류 헤드만 재학습합니다. 이것이 전이 학습입니다. 이러한 복잡한 컨볼루션 레이어 배열이 작동하는 방식은 나중에 살펴봅니다. 지금은 다른 사람의 문제입니다.
Keras의 전이 학습
Keras에서는 tf.keras.applications.*
모음에서 사전 학습된 모델을 인스턴스화할 수 있습니다. 예를 들어 MobileNet V2는 크기가 합리적으로 유지되는 매우 훌륭한 컨볼루셔널 아키텍처입니다. include_top=False
를 선택하면 최종 softmax 레이어 없이 사전 학습된 모델을 가져와서 직접 추가할 수 있습니다.
pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False
model = tf.keras.Sequential([
pretrained_model,
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(5, activation='softmax')
])
pretrained_model.trainable = False
설정도 확인합니다. 소프트맥스 레이어만 학습시킬 수 있도록 선행 학습된 모델의 가중치와 편향을 고정합니다. 이는 일반적으로 상대적으로 적은 가중치를 포함하며 매우 큰 데이터 세트를 필요로 하지 않고 신속하게 수행할 수 있습니다. 하지만 데이터가 많은 경우 pretrained_model.trainable = True
를 사용하면 전이 학습이 더 잘 작동할 수 있습니다. 그러면 선행 학습된 가중치가 훌륭한 초깃값을 제공하고 문제에 더 적합하도록 학습을 통해 조정할 수 있습니다.
마지막으로, 촘촘한 softmax 레이어 앞에 삽입된 Flatten()
레이어를 확인합니다. 밀집 레이어는 데이터의 평평한 벡터에서 작동하지만 선행 학습된 모델이 반환하는 것이 맞는지는 알 수 없습니다. 그것이 평탄화해야 하는 이유입니다. 다음 장에서는 컨볼루션 아키텍처를 자세히 살펴보면서 컨볼루션 레이어에서 반환하는 데이터 형식을 설명합니다.
이 접근 방식을 사용하면 정확도가 75%에 가까워집니다.
해결 방법
다음은 솔루션 노트북입니다. 문제가 있는 경우 사용할 수 있습니다.
Keras Flowers transfer learning (solution).ipynb
학습한 내용
- 🤔 Keras에서 분류기를 작성하는 방법
- 🤓 소프트맥스 마지막 레이어 및 교차 엔트로피 손실로 구성
- 😈 전이 학습
- 🤔 첫 번째 모델 학습
- 🧐 학습 중 손실 및 정확도 추적
잠시 시간을 내어 이 체크리스트를 머릿속에 살펴보세요.
5. 축하합니다.
이제 Keras 모델을 빌드할 수 있습니다. 다음 실습을 계속 진행하여 컨볼루셔널 레이어를 조합하는 방법을 알아보세요.
- TPU 속도 데이터 파이프라인: tf.data.Dataset 및 TFRecords
- [이 실습] 전이 학습을 사용한 첫 번째 Keras 모델
- Keras 및 TPU를 사용한 컨볼루션 신경망
- Keras 및 TPU를 사용한 최신 ConvNets, SqueezeNet, Xception
실제 TPU 사용
TPU 및 GPU는 Cloud AI Platform에서 사용할 수 있습니다.
마지막으로, YouTube는 고객의 의견을 소중하게 생각합니다. 이 실습에서 부족한 부분이 있거나 개선이 필요하다고 생각되는 부분이 있으면 알려 주세요. 의견은 GitHub 문제[의견 링크]를 통해 제공할 수 있습니다.
|