อย่าใช้ Flatten() - การรวมตัวกันทั่วโลกสำหรับ CNN ด้วย TensorFlow และ Keras PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

อย่าใช้ Flatten() – Global Pooling สำหรับ CNN ด้วย TensorFlow และ Keras

ผู้ปฏิบัติงานส่วนใหญ่ในขณะที่เรียนรู้เกี่ยวกับสถาปัตยกรรม Convolutional Neural Network (CNN) ในครั้งแรก เรียนรู้ว่าประกอบด้วยส่วนพื้นฐานสามส่วน:

  • ชั้น Convolutional
  • การรวมเลเยอร์
  • เลเยอร์ที่เชื่อมต่ออย่างเต็มที่

ทรัพยากรส่วนใหญ่มี บาง การเปลี่ยนแปลงในการแบ่งส่วนนี้ รวมทั้งหนังสือของฉันเอง โดยเฉพาะอย่างยิ่งออนไลน์ – เลเยอร์ที่เชื่อมต่ออย่างสมบูรณ์หมายถึงa ชั้นแบน และ (โดยปกติ) ทวีคูณ ชั้นหนาแน่น.

สิ่งนี้เคยเป็นบรรทัดฐาน และสถาปัตยกรรมที่รู้จักกันดีเช่น VGGNets ใช้แนวทางนี้ และจะจบลงด้วย:

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 เป็นสถาปัตยกรรมสุดท้ายที่ใช้วิธีการนี้ เนื่องมาจากคอขวดในการคำนวณที่เห็นได้ชัด ทันทีที่ ResNets เผยแพร่เพียงหนึ่งปีหลังจาก VGGNets (และเมื่อ 7 ปีที่แล้ว) สถาปัตยกรรมกระแสหลักทั้งหมดสิ้นสุดคำจำกัดความของโมเดลด้วย:

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

การแบนใน CNN เกิดขึ้นมาเป็นเวลา 7 ปีแล้ว ! และดูเหมือนว่าจะมีคนไม่มากพอที่พูดถึงผลเสียหายที่เกิดขึ้นกับทั้งประสบการณ์การเรียนรู้ของคุณและทรัพยากรการคำนวณที่คุณใช้อยู่

Global Average Pooling เป็นที่นิยมในหลายๆ บัญชีมากกว่า Flatten หากคุณกำลังสร้างต้นแบบ CNN ขนาดเล็ก – ให้ใช้ Global Pooling หากคุณกำลังสอนใครบางคนเกี่ยวกับ CNN – ใช้ Global Pooling หากคุณกำลังสร้าง MVP – ใช้ Global Pooling ใช้เลเยอร์ที่แบนราบสำหรับกรณีการใช้งานอื่นๆ ที่จำเป็นจริงๆ

กรณีศึกษา – Flattening vs Global Pooling

Global Pooling ย่อแผนที่คุณลักษณะทั้งหมดให้เป็นหนึ่งเดียว โดยรวมข้อมูลที่เกี่ยวข้องทั้งหมดไว้ในแผนที่เดียวที่สามารถเข้าใจได้ง่ายด้วยชั้นการจำแนกที่หนาแน่นเพียงชั้นเดียวแทนที่จะเป็นหลายชั้น โดยทั่วไปจะใช้เป็นการรวมกันเฉลี่ย (GlobalAveragePooling2D) หรือการรวมสูงสุด (GlobalMaxPooling2D) และสามารถทำงานกับอินพุต 1D และ 3D ได้เช่นกัน

แทนที่จะแบนแผนที่คุณลักษณะเช่น (7, 7, 32) เป็นเวกเตอร์ที่มีความยาว 1536 และฝึกหนึ่งหรือหลายเลเยอร์เพื่อแยกแยะรูปแบบจากเวกเตอร์ยาวนี้: เราสามารถย่อให้เป็น (7, 7) เวกเตอร์และจำแนกโดยตรงจากที่นั่น มันง่ายมาก!

โปรดทราบว่าเลเยอร์คอขวดสำหรับเครือข่ายอย่าง ResNets นับรวมในฟีเจอร์นับหมื่น ไม่ใช่เพียง 1536 อัน เมื่อทำให้แบนราบ คุณกำลังทรมานเครือข่ายของคุณเพื่อเรียนรู้จากเวกเตอร์ที่มีรูปร่างผิดปกติในลักษณะที่ไม่มีประสิทธิภาพมาก ลองนึกภาพภาพ 2 มิติที่ถูกตัดบนทุกแถวพิกเซลแล้วต่อเป็นเวกเตอร์แบบแบน พิกเซลสองพิกเซลที่เคยห่างกัน 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.5M. EfficientNets หนึ่งในเครือข่ายที่มีประสิทธิภาพดีที่สุดที่เคยออกแบบมาให้ทำงานที่พารามิเตอร์ ~6M และไม่สามารถเปรียบเทียบกับโมเดลง่ายๆ นี้ได้ในแง่ของประสิทธิภาพที่แท้จริงและความสามารถในการเรียนรู้จากข้อมูล

เราสามารถลดจำนวนนี้ได้อย่างมากโดยทำให้เครือข่ายมีความลึกมากขึ้น ซึ่งจะแนะนำการรวมกลุ่มสูงสุด (และอาจมีการพลิกคว่ำ) เพื่อลดแผนที่คุณลักษณะก่อนที่จะถูกทำให้แบน อย่างไรก็ตาม ให้พิจารณาว่าเรากำลังทำให้เครือข่ายซับซ้อนมากขึ้น เพื่อที่จะทำให้มันมีต้นทุนในการคำนวณน้อยลง ทั้งหมดนี้ก็เพื่อเห็นแก่เลเยอร์เดียวที่ต้องใช้ความพยายามอย่างมากในแผนงาน

การทำเลเยอร์ให้ลึกขึ้นควรเป็นการดึงความสัมพันธ์ที่ไม่เป็นเส้นตรงระหว่างจุดข้อมูลซึ่งมีความหมายมากกว่า ไม่ใช่ลดขนาดอินพุตเพื่อรองรับเลเยอร์ที่แบนราบ

นี่คือเครือข่ายที่มีการรวมกันทั่วโลก:

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
_________________________________________________________________

ดีขึ้นมาก! ถ้าเราเจาะลึกลงไปในโมเดลนี้ จำนวนพารามิเตอร์จะเพิ่มขึ้น และเราอาจสามารถจับรูปแบบข้อมูลที่ซับซ้อนมากขึ้นด้วยเลเยอร์ใหม่ได้ หากทำอย่างไร้เดียงสา ปัญหาเดียวกันกับที่ผูกไว้กับ VGGNets ก็จะเกิดขึ้น

ก้าวต่อไป - โครงการ End-to-End แบบใช้มือถือ

ธรรมชาติที่อยากรู้อยากเห็นของคุณทำให้คุณต้องการไปต่อหรือไม่? เราขอแนะนำให้ตรวจสอบของเรา โครงการแนะนำ: “โครงข่ายประสาทเทียม – นอกเหนือจากสถาปัตยกรรมพื้นฐาน”.

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

ฉันจะพาคุณเดินทางข้ามเวลาสักเล็กน้อย – ตั้งแต่ปี 1998 ถึง 2022 โดยเน้นย้ำถึงสถาปัตยกรรมที่กำหนดซึ่งพัฒนาขึ้นตลอดหลายปีที่ผ่านมา สิ่งที่ทำให้สถาปัตยกรรมเหล่านี้มีเอกลักษณ์เฉพาะตัว มีข้อเสียอย่างไร และนำสถาปัตยกรรมที่โดดเด่นมาใช้ตั้งแต่เริ่มต้น ไม่มีอะไรดีไปกว่าการมีสิ่งสกปรกติดมือเมื่อพูดถึงสิ่งเหล่านี้

คุณสามารถขับรถได้โดยไม่ต้องรู้ว่าเครื่องยนต์มี 4 หรือ 8 สูบ และตำแหน่งของวาล์วภายในเครื่องยนต์เป็นอย่างไร อย่างไรก็ตาม หากคุณต้องการออกแบบและชื่นชมเครื่องยนต์ (โมเดลการมองเห็นของคอมพิวเตอร์) คุณจะต้องเจาะลึกลงไปอีกเล็กน้อย แม้ว่าคุณจะไม่ต้องการใช้เวลาออกแบบสถาปัตยกรรมและต้องการสร้างผลิตภัณฑ์แทน ซึ่งเป็นสิ่งที่อยากทำมากที่สุด คุณจะพบข้อมูลสำคัญในบทเรียนนี้ คุณจะได้เรียนรู้ว่าเหตุใดการใช้สถาปัตยกรรมที่ล้าสมัยอย่าง VGGNet จะส่งผลเสียต่อผลิตภัณฑ์และประสิทธิภาพของคุณ และทำไมคุณควรข้ามไปหากคุณกำลังสร้างสิ่งใหม่ๆ และคุณจะได้เรียนรู้ว่าสถาปัตยกรรมใดที่คุณสามารถใช้แก้ปัญหาในทางปฏิบัติและสิ่ง ข้อดีและข้อเสียสำหรับแต่ละ

หากคุณต้องการใช้คอมพิวเตอร์วิทัศน์ในสาขาของคุณ โดยใช้แหล่งข้อมูลจากบทเรียนนี้ คุณจะสามารถค้นหาโมเดลใหม่ล่าสุด เข้าใจวิธีการทำงาน และด้วยเกณฑ์ที่คุณสามารถเปรียบเทียบและตัดสินใจได้ ใช้.

คุณ ทำไม่ได้ ต้องมี Google สำหรับสถาปัตยกรรมและการนำไปใช้ - โดยทั่วไปจะมีการอธิบายอย่างชัดเจนในเอกสารและเฟรมเวิร์กเช่น Keras ทำให้การใช้งานเหล่านี้ง่ายกว่าที่เคย ประเด็นสำคัญของโครงการแนะนำนี้คือการสอนวิธีค้นหา อ่าน นำไปใช้ และทำความเข้าใจสถาปัตยกรรมและเอกสาร ไม่มีทรัพยากรใดในโลกที่จะสามารถติดตามการพัฒนาใหม่ล่าสุดทั้งหมดได้ ฉันได้รวมเอกสารใหม่ล่าสุดไว้ที่นี่ แต่ในอีกไม่กี่เดือน ฉบับใหม่จะปรากฏขึ้น และนั่นเป็นสิ่งที่หลีกเลี่ยงไม่ได้ การรู้ว่าจะหาการใช้งานที่น่าเชื่อถือได้ที่ไหน เปรียบเทียบกับเอกสาร และปรับแต่งมันจะทำให้คุณได้เปรียบในการแข่งขันที่จำเป็นสำหรับผลิตภัณฑ์คอมพิวเตอร์วิทัศน์จำนวนมากที่คุณอาจต้องการสร้าง

สรุป

ในคู่มือฉบับย่อนี้ เราได้พิจารณาทางเลือกอื่นในการออกแบบสถาปัตยกรรม CNN ให้แบนราบ แม้ว่าจะสั้น - คู่มือนี้จะกล่าวถึงปัญหาทั่วไปเมื่อออกแบบต้นแบบหรือ MVP และแนะนำให้คุณใช้ทางเลือกอื่นที่ดีกว่าในการทำให้แบนราบ

วิศวกรคอมพิวเตอร์วิทัศน์ที่มีประสบการณ์จะทราบและนำหลักการนี้ไปใช้ โชคไม่ดีที่ดูเหมือนว่าจะไม่ได้รับการถ่ายทอดอย่างถูกต้องให้กับผู้ฝึกหัดใหม่ที่เพิ่งเข้าสู่สนามและสามารถสร้างนิสัยที่เหนียวแน่นซึ่งต้องใช้เวลาสักครู่ในการกำจัด

หากคุณกำลังเข้าสู่ Computer Vision - ทำสิ่งที่ชอบและอย่าใช้เลเยอร์ที่แบนราบก่อนที่จะจัดหมวดหมู่ในเส้นทางการเรียนรู้ของคุณ

ประทับเวลา:

เพิ่มเติมจาก สแต็ค