Flatten()을 사용하지 마십시오 - TensorFlow 및 Keras PlatoBlockchain 데이터 인텔리전스를 사용하는 CNN에 대한 전역 풀링. 수직 검색. 일체 포함.

Flatten()을 사용하지 마십시오 – TensorFlow 및 Keras를 사용하는 CNN에 대한 전역 풀링

대부분의 실무자는 CNN(Convolutional Neural Network) 아키텍처에 대해 처음 배우는 동안 이것이 세 가지 기본 세그먼트로 구성되어 있음을 배웁니다.

  • 컨볼루션 레이어
  • 풀링 레이어
  • 완전히 연결된 레이어

대부분의 리소스에는 일부 내 책을 포함하여 이 세분화의 변형입니다. 특히 온라인 – 완전 연결 계층은 평탄화 층 그리고 (일반적으로) 여러 조밀한 층.

이것은 표준이었고 VGGNet과 같은 잘 알려진 아키텍처는 이 접근 방식을 사용했으며 다음과 같이 끝납니다.

model = keras.Sequential([
    
    keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'), 
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dense(n_classes, activation='softmax')
])

그러나 어떤 이유로 VGGNet이 생성하는 명백한 계산 병목 현상으로 인해 이 접근 방식을 사용한 거의 마지막 아키텍처라는 사실을 종종 잊었습니다. VGGNets(및 7년 전) 직후에 출판된 ResNets가 나오자 마자 모든 주류 아키텍처는 다음과 같이 모델 정의를 종료했습니다.

model = keras.Sequential([
    
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(n_classes, activation='softmax')
])

CNN에서 Flattening은 7년 동안 계속되었습니다. 7년! 그리고 학습 경험과 사용 중인 컴퓨팅 리소스 모두에 미치는 피해에 대해 이야기하는 사람이 충분하지 않은 것 같습니다.

글로벌 평균 풀링은 평면화보다 많은 계정에서 선호됩니다. 작은 CNN을 프로토타이핑하는 경우 글로벌 풀링을 사용하십시오. 누군가에게 CNN을 가르치고 있다면 글로벌 풀링을 사용하십시오. MVP를 만들고 있다면 글로벌 풀링을 사용하십시오. 실제로 필요한 다른 사용 사례에는 병합 레이어를 사용합니다.

사례 연구 – 병합 대 글로벌 풀링

글로벌 풀링은 모든 기능 맵을 단일 맵으로 압축하여 모든 관련 정보를 여러 레이어 대신 단일 밀집 분류 레이어에서 쉽게 이해할 수 있는 단일 맵으로 풀링합니다. 일반적으로 평균 풀링(GlobalAveragePooling2D) 또는 최대 풀링(GlobalMaxPooling2D) 1D 및 3D 입력에도 사용할 수 있습니다.

다음과 같은 기능 맵을 평면화하는 대신 (7, 7, 32) 길이가 1536인 벡터로 변환하고 하나 또는 여러 레이어를 훈련하여 이 긴 벡터에서 패턴을 식별합니다. (7, 7) 벡터 및 거기에서 직접 분류합니다. 간단합니다!

ResNet과 같은 네트워크의 병목 계층은 1536개가 아닌 수만 개의 기능으로 계산됩니다. 병합할 때 네트워크를 고문하여 매우 비효율적인 방식으로 이상한 모양의 벡터에서 학습하게 됩니다. 2D 이미지가 모든 픽셀 행에서 슬라이스된 다음 평면 벡터로 연결된다고 상상해 보십시오. 세로로 0픽셀 떨어져 있던 두 픽셀은 feature_map_width 수평으로 픽셀 떨어져! 이것은 공간 불변성을 선호하는 분류 알고리즘에는 그다지 중요하지 않을 수 있지만 이것은 컴퓨터 비전의 다른 응용 프로그램에 대해 개념적으로도 좋지 않습니다.

두 개의 조밀한 레이어가 있는 평탄화 레이어를 사용하는 작은 데모 네트워크를 정의해 보겠습니다.

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.summary()

요약은 어떻게 생겼나요?

...                                                              
 dense_6 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 11,574,090
Trainable params: 11,573,898
Non-trainable params: 192
_________________________________________________________________

장난감 네트워크에 대한 11.5만 매개변수 – 더 많은 입력으로 인해 매개변수가 폭발적으로 증가하는 것을 지켜보십시오. 11.5만 매개변수. 지금까지 설계된 최고의 성능 네트워크 중 하나인 EfficientNets는 ~6M 매개변수에서 작동하며 실제 성능 및 데이터에서 학습할 수 있는 용량 측면에서 이 간단한 모델과 비교할 수 없습니다.

우리는 네트워크를 더 깊게 만들어 이 숫자를 상당히 줄일 수 있습니다. 그러면 더 많은 최대 풀링(및 잠재적으로 strided convolution)이 도입되어 기능 맵이 평평해지기 전에 줄일 수 있습니다. 그러나 계산 비용을 줄이기 위해 네트워크를 더 복잡하게 만드는 것을 고려하십시오. 이 모든 것은 계획에 어려움을 주는 단일 계층을 위해서입니다.

레이어에 대해 더 깊이 들어가면 데이터 포인트 간의 더 의미 있고 비선형적인 관계를 추출해야 하며 평면화 레이어에 맞게 입력 크기를 줄이는 것이 아닙니다.

글로벌 풀링이 있는 네트워크는 다음과 같습니다.

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(10, activation='softmax')
])

model.summary()

요약?

 dense_8 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 66,602
Trainable params: 66,410
Non-trainable params: 192
_________________________________________________________________

훨씬 낫다! 이 모델에 대해 더 깊이 들어가면 매개변수 수가 증가하고 새 레이어로 더 복잡한 데이터 패턴을 캡처할 수 있습니다. 순진하게 수행하면 VGGNet을 묶는 것과 동일한 문제가 발생합니다.

더 나아가기 – 핸드헬드 엔드 투 엔드 프로젝트

당신의 호기심 많은 성격이 당신을 더 멀리 가고 싶게 만드나요? 다음을 확인하는 것이 좋습니다. 가이드 프로젝트: “Convolutional Neural Networks – 기본 아키텍처를 넘어”.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

1998년부터 2022년까지 몇 년 동안 개발된 정의 아키텍처, 아키텍처를 독특하게 만든 요소, 단점이 무엇인지 강조하고 주목할만한 아키텍처를 처음부터 구현하는 약간의 시간 여행으로 안내하겠습니다. 이것에 관해서는 손에 약간의 흙이 묻은 것보다 더 좋은 것은 없습니다.

엔진에 4기통인지 8기통인지, 그리고 엔진 내 밸브의 위치를 ​​알지 못해도 자동차를 운전할 수 있습니다. 그러나 – 엔진(컴퓨터 비전 모델)을 설계하고 감상하고 싶다면 조금 더 깊이 들어가고 싶을 것입니다. 아키텍처를 설계하는 데 시간을 들이고 싶지 않고 대신 제품을 만들고 싶어도 대부분이 하고 싶어합니다. 이 강의에서 중요한 정보를 찾을 수 있습니다. VGGNet과 같은 구식 아키텍처를 사용하면 제품과 성능이 저하되는 이유와 현대적인 것을 구축하는 경우 이러한 아키텍처를 건너뛰어야 하는 이유를 배우고 실제 문제를 해결하기 위해 어떤 아키텍처로 갈 수 있는지, 무엇을 장단점은 각각입니다.

이 강의의 리소스를 사용하여 컴퓨터 비전을 해당 분야에 적용하려는 경우 최신 모델을 찾고 작동 방식과 기준을 통해 비교할 수 있으며 어떤 기준을 적용할지 결정할 수 있습니다. 사용.

자신의 하지 아키텍처 및 구현에 대해 Google에 문의해야 합니다. 일반적으로 문서에 매우 명확하게 설명되어 있으며 Keras와 같은 프레임워크를 사용하면 이러한 구현이 그 어느 때보다 쉬워집니다. 이 가이드 프로젝트의 핵심 내용은 아키텍처와 문서를 찾고, 읽고, 구현하고, 이해하는 방법을 가르치는 것입니다. 세계의 어떤 자원도 모든 최신 개발을 따라갈 수 없습니다. 나는 여기에 최신 논문을 포함시켰습니다. 하지만 몇 달 안에 새로운 논문이 나올 것이고 그것은 불가피합니다. 신뢰할 수 있는 구현을 찾을 수 있는 위치를 알고 문서와 비교하고 수정하면 구축하려는 많은 컴퓨터 비전 제품에 필요한 경쟁력을 얻을 수 있습니다.

결론

이 짧은 가이드에서는 CNN 아키텍처 설계에서 평면화에 대한 대안을 살펴보았습니다. 짧지만 이 가이드는 프로토타입 또는 MVP를 설계할 때 일반적인 문제를 해결하고 병합에 대한 더 나은 대안을 사용하도록 조언합니다.

노련한 컴퓨터 비전 엔지니어라면 누구나 이 원칙을 알고 적용할 것이며, 이러한 관행은 당연하게 받아들여집니다. 유감스럽게도 이제 막 현장에 입문한 새로운 실무자에게 제대로 전달되지 않는 것 같고, 제거하는 데 시간이 걸리는 끈적한 습관을 만들 수 있습니다.

Computer Vision에 입문하는 경우 학습 과정에서 분류 헤드 전에 병합 레이어를 사용하지 말고 스스로에게 유리합니다.

타임 스탬프 :

더보기 스택카부스