Không sử dụng Flatten() - Tập hợp toàn cầu cho CNN với TensorFlow và Keras PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Không sử dụng Flatten () - Tổng hợp toàn cầu cho CNN với TensorFlow và Keras

Hầu hết các học viên, trong khi lần đầu tiên tìm hiểu về kiến ​​trúc Mạng nơ-ron hợp pháp (CNN) - hãy biết rằng nó bao gồm ba phân đoạn cơ bản:

  • Các lớp hợp hiến
  • Nhóm các lớp
  • Các lớp được kết nối đầy đủ

Hầu hết các nguồn có một số biến thể về phân đoạn này, bao gồm cả cuốn sách của riêng tôi. Đặc biệt là trực tuyến - các lớp được kết nối đầy đủ đề cập đến một lớp làm phẳng và (thường) nhiều lớp dày đặc.

Đây từng là tiêu chuẩn và các kiến ​​trúc nổi tiếng như VGGNets đã sử dụng cách tiếp cận này và sẽ kết thúc bằng:

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')
])

Mặc dù vậy, vì một số lý do - đôi khi người ta quên rằng VGGNet thực tế là kiến ​​trúc cuối cùng sử dụng cách tiếp cận này, do nút cổ chai tính toán rõ ràng mà nó tạo ra. Ngay sau khi ResNets, được xuất bản chỉ một năm sau VGGNets (và 7 năm trước), tất cả các kiến ​​trúc chính thống đã kết thúc các định nghĩa mô hình của họ bằng:

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

Làm phẳng trong CNNs đã tồn tại được 7 năm. 7 năm! Và dường như không có đủ người nói về tác hại của nó đối với cả trải nghiệm học tập của bạn và các tài nguyên tính toán mà bạn đang sử dụng.

Tổng hợp trung bình toàn cầu thích hợp hơn trên nhiều tài khoản hơn là làm phẳng. Nếu bạn đang bảo vệ một CNN nhỏ - hãy sử dụng Global Pooling. Nếu bạn đang dạy ai đó về CNN - hãy sử dụng Global Pooling. Nếu bạn đang tạo MVP - hãy sử dụng Global Pooling. Sử dụng các lớp làm phẳng cho các trường hợp sử dụng khác khi chúng thực sự cần thiết.

Nghiên cứu điển hình - Làm phẳng so với Tổng hợp toàn cầu

Global Pooling tập hợp tất cả các bản đồ đối tượng thành một bản đồ duy nhất, gộp tất cả thông tin liên quan vào một bản đồ duy nhất có thể dễ dàng hiểu được bằng một lớp phân loại dày đặc duy nhất thay vì nhiều lớp. Nó thường được áp dụng dưới dạng tổng hợp trung bình (GlobalAveragePooling2D) hoặc gộp tối đa (GlobalMaxPooling2D) và cũng có thể hoạt động cho đầu vào 1D và 3D.

Thay vì làm phẳng một bản đồ đối tượng địa lý, chẳng hạn như (7, 7, 32) thành một vectơ có độ dài 1536 và đào tạo một hoặc nhiều lớp để phân biệt các mẫu từ vectơ dài này: chúng ta có thể cô đọng nó thành một (7, 7) vectơ và phân loại trực tiếp từ đó. Nó đơn giản mà!

Lưu ý rằng các lớp nút cổ chai cho các mạng như ResNets tính đến hàng chục nghìn tính năng chứ không phải chỉ có 1536. Khi làm phẳng, bạn đang tra tấn mạng của mình để học từ các vectơ có hình dạng kỳ lạ theo cách rất kém hiệu quả. Hãy tưởng tượng một hình ảnh 2D được cắt trên mỗi hàng pixel và sau đó được nối thành một vector phẳng. Hai pixel từng cách nhau 0 pixel theo chiều dọc thì không feature_map_width pixel đi theo chiều ngang! Mặc dù điều này có thể không quá quan trọng đối với một thuật toán phân loại, vốn ủng hộ sự bất biến trong không gian - điều này thậm chí sẽ không tốt về mặt khái niệm đối với các ứng dụng khác của thị giác máy tính.

Hãy xác định một mạng trình diễn nhỏ sử dụng một lớp làm phẳng với một vài lớp dày đặc:

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()

Bản tóm tắt trông như thế nào?

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

Thông số 11.5M cho mạng đồ chơi - và xem các thông số bùng nổ với đầu vào lớn hơn. 11.5M thông số. EfficientNets, một trong những mạng hoạt động tốt nhất từng được thiết kế hoạt động ở thông số ~ 6M và không thể so sánh với mô hình đơn giản này về hiệu suất thực tế và khả năng học hỏi từ dữ liệu.

Chúng tôi có thể giảm đáng kể con số này bằng cách làm cho mạng sâu hơn, điều này sẽ giới thiệu nhiều tổng hợp tối đa hơn (và có khả năng tích lũy theo chuỗi) để giảm các bản đồ đối tượng trước khi chúng bị san phẳng. Tuy nhiên, hãy cân nhắc rằng chúng tôi sẽ làm cho mạng phức tạp hơn để làm cho nó ít tốn kém hơn về mặt tính toán, tất cả chỉ vì lợi ích của một lớp duy nhất đang tạo ra một chìa khóa cho các kế hoạch.

Đi sâu hơn với các lớp nên trích xuất các mối quan hệ phi tuyến tính, có ý nghĩa hơn giữa các điểm dữ liệu, chứ không phải giảm kích thước đầu vào để phục vụ cho một lớp làm phẳng.

Đây là một mạng với tính năng tổng hợp toàn cầu:

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()

Bản tóm tắt?

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

Tốt hơn nhiều! Nếu chúng ta đi sâu hơn với mô hình này, số lượng tham số sẽ tăng lên và chúng ta có thể nắm bắt được nhiều mẫu dữ liệu phức tạp hơn với các lớp mới. Tuy nhiên, nếu được thực hiện một cách ngây thơ, các vấn đề tương tự ràng buộc VGGNets sẽ phát sinh.

Tiến xa hơn - Dự án từ đầu đến cuối được cầm tay chỉ việc

Bản tính ham học hỏi của bạn khiến bạn muốn tiến xa hơn? Chúng tôi khuyên bạn nên kiểm tra Dự án có hướng dẫn: “Mạng nơ-ron hợp pháp - Vượt ra ngoài các kiến ​​trúc cơ bản”.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Tôi sẽ đưa bạn du hành một chút thời gian - từ năm 1998 đến năm 2022, làm nổi bật những kiến ​​trúc xác định được phát triển trong suốt nhiều năm, điều gì khiến chúng trở nên độc đáo, nhược điểm của chúng và triển khai những kiến ​​trúc đáng chú ý từ đầu. Không có gì tốt hơn khi bạn có một số bụi bẩn trên tay khi nói đến những thứ này.

Bạn có thể lái xe ô tô mà không cần biết động cơ có 4 hay 8 xi lanh và vị trí của các van trong động cơ như thế nào. Tuy nhiên - nếu bạn muốn thiết kế và đánh giá cao một động cơ (mô hình thị giác máy tính), bạn sẽ muốn đi sâu hơn một chút. Ngay cả khi bạn không muốn dành thời gian thiết kế kiến ​​trúc và thay vào đó muốn xây dựng sản phẩm, đó là điều mà hầu hết mọi người đều muốn làm - bạn sẽ tìm thấy thông tin quan trọng trong bài học này. Bạn sẽ tìm hiểu lý do tại sao việc sử dụng các kiến ​​trúc lỗi thời như VGGNet sẽ làm ảnh hưởng đến sản phẩm và hiệu suất của bạn và tại sao bạn nên bỏ qua chúng nếu bạn đang xây dựng bất kỳ thứ gì hiện đại và bạn sẽ tìm hiểu kiến ​​trúc nào bạn có thể sử dụng để giải quyết các vấn đề thực tế và những gì những ưu và khuyết điểm là cho mỗi.

Nếu bạn đang muốn áp dụng tầm nhìn máy tính vào lĩnh vực của mình, bằng cách sử dụng các tài nguyên từ bài học này - bạn sẽ có thể tìm thấy các mô hình mới nhất, hiểu cách chúng hoạt động và theo tiêu chí nào bạn có thể so sánh chúng và đưa ra quyết định sử dụng.

Bạn không phải tìm đến Google để biết các kiến ​​trúc và cách triển khai của chúng - chúng thường được giải thích rất rõ ràng trong các bài báo và các khuôn khổ như Keras làm cho việc triển khai này trở nên dễ dàng hơn bao giờ hết. Điểm mấu chốt của Dự án có hướng dẫn này là dạy bạn cách tìm, đọc, triển khai và hiểu các kiến ​​trúc và giấy tờ. Không có tài nguyên nào trên thế giới có thể theo kịp tất cả những phát triển mới nhất. Tôi đã bao gồm những bài báo mới nhất ở đây - nhưng trong vài tháng nữa, những bài báo mới sẽ xuất hiện và đó là điều không thể tránh khỏi. Biết nơi để tìm các triển khai đáng tin cậy, so sánh chúng với giấy tờ và chỉnh sửa chúng có thể mang lại cho bạn lợi thế cạnh tranh cần thiết cho nhiều sản phẩm thị giác máy tính mà bạn có thể muốn xây dựng.

Kết luận

Trong hướng dẫn ngắn này, chúng tôi đã xem xét một giải pháp thay thế cho việc làm phẳng trong thiết kế kiến ​​trúc CNN. Mặc dù ngắn gọn - hướng dẫn giải quyết một vấn đề phổ biến khi thiết kế nguyên mẫu hoặc MVP và khuyên bạn nên sử dụng một giải pháp thay thế tốt hơn để làm phẳng.

Bất kỳ Kỹ sư Thị giác Máy tính dày dặn kinh nghiệm nào cũng sẽ biết và áp dụng nguyên tắc này, và việc thực hành được coi là đương nhiên. Một cách khó chịu, nó dường như không được chuyển tiếp đúng cách cho các học viên mới bắt đầu bước vào lĩnh vực này, và có thể tạo ra những thói quen khó bỏ mà phải mất một thời gian mới loại bỏ được.

Nếu bạn đang tham gia vào Computer Vision - hãy tự giúp mình và không sử dụng các lớp làm phẳng trước khi phân loại đứng đầu trong hành trình học tập của bạn.

Dấu thời gian:

Thêm từ xếp chồng lên nhau