วิธีเพิ่มหมวดหมู่ใหม่ในรูปแบบการเรียนรู้ลึก


15

สมมติว่าฉันถ่ายโอนการเรียนรู้บนเครือข่ายที่ผ่านการฝึกอบรมมาแล้วเพื่อรับรู้วัตถุ 10 รายการ เพิ่มรายการที่ 11 ที่เครือข่ายสามารถจำแนกได้อย่างไรโดยไม่สูญเสีย 10 หมวดหมู่ทั้งหมดที่ฉันได้รับการฝึกฝนแล้วหรือข้อมูลจากแบบจำลองที่ผ่านการฝึกอบรมมาก่อน เพื่อนบอกฉันว่างานวิจัยที่กำลังเกิดขึ้นในสาขานี้ แต่ฉันไม่สามารถหาเอกสารที่เกี่ยวข้องหรือชื่อที่จะค้นหา?

ขอขอบคุณ.


ถ้าคุณฝึกฝนด้วยคลาสที่มากขึ้น นั่นช่วยได้ไหม ตัวอย่างเช่นสมมติว่าคุณรู้ว่าจะมีไม่เกิน 1,000 คลาส คุณฝึกฝนตั้งแต่เริ่มต้นลักษณนามของคุณด้วยคลาส 1,000 ในคลาสที่คุณมีอยู่ 10 คลาสและเมื่อคุณมีคลาสเพิ่มขึ้นเพียงเก็บรถไฟไว้ ... นั่นเป็นวิธีที่ดีหรือไม่? มีบทความเกี่ยวกับวิธีการนี้หรือไม่?
Michael

คำตอบ:


13

หากนี่เป็นเพียงครั้งเดียวคุณสามารถฝึกอบรมโครงข่ายประสาทเทียมได้อีกครั้ง หากคุณต้องเพิ่มคลาสใหม่บ่อยครั้งนี่เป็นความคิดที่ไม่ดี สิ่งที่คุณต้องการทำในกรณีเช่นนี้เรียกว่าการดึงภาพจากเนื้อหา (CBIR) หรือเรียกค้นภาพหรือค้นหาภาพ ฉันจะอธิบายทั้งสองกรณีในคำตอบของฉันด้านล่าง

กรณีหนึ่งครั้ง

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

กรณีที่รุนแรงคือการฝึกน้ำหนักตัวใหม่เท่านั้น แต่ฉันไม่แน่ใจว่าจะใช้งานได้ดีหรือไม่ - อาจคุ้มค่าที่จะลอง

การดึงภาพจากเนื้อหา

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

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

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

ตอนนี้ผู้คนมักใช้เครือข่ายที่ได้รับการฝึกฝนมาก่อนเช่น VGG-16 ตัดเลเยอร์ FC และใช้ convolutional ขั้นสุดท้ายเป็นเวกเตอร์ตัวบ่งชี้ของคุณ คุณสามารถฝึกอบรมเครือข่ายนี้เพิ่มเติมเช่นโดยใช้เครือข่ายสยามที่มีการสูญเสีย triplet


ฉันมองการเรียนรู้ครั้งเดียว คุณคิดว่าสามารถช่วยฉันได้ไหม?
nnrales

ฉันไม่รู้จริงๆเกี่ยวกับการเรียนรู้แบบนัดเดียว แต่เอกสารการเรียนรู้เชิงลึกแบบ one-shot ที่ฉันพบนั้นค่อนข้างคล้ายกับวิธีการของ CBIR ดังนั้นมันจะมีประโยชน์สำหรับคุณอย่างแน่นอน
hbaderts

2

โทโพโลยีเครือข่ายของคุณอาจดูแตกต่างกัน แต่ในที่สุดเครือข่ายที่ผ่านการอบรมมาแล้วของคุณจะมีเลเยอร์ซึ่งจัดการการรับรู้ของคลาสดั้งเดิม 10 คลาส เคล็ดลับที่ง่ายที่สุด (และการทำงาน) ที่จะแนะนำคลาสที่ 11, 12th .. nth class คือการใช้เลเยอร์ทั้งหมดก่อนที่จะได้รับและเพิ่มเลเยอร์เพิ่มเติม (ในโมเดลใหม่หรือเป็นแบบคู่ขนาน) ที่จะนั่ง ด้านบนของทุกชั้น แต่สุดท้ายจะมีลักษณะคล้ายกับชั้น 10class (ซึ่งส่วนใหญ่อาจเป็น matmul ของชั้นหนาแน่นและเมทริกซ์ของรูปร่างที่[len(dense layer), 10]มีอคติตัวเลือก)

ชั้นใหม่ของคุณจะเป็นชั้น matmul [len(dense layer), len(new classes)]ที่มีรูปร่าง

หากไม่มีการเข้าถึงข้อมูลการฝึกอบรมดั้งเดิมคุณจะมีสองตัวเลือกดังนี้

  1. ตรึงน้ำหนักทั้งหมดในเลเยอร์ดั้งเดิมด้วยการอนุญาตให้โมเดล "ใหม่" ปรับน้ำหนักใหม่เท่านั้น นั่นจะให้พลังการทำนายที่เหมือนกันสำหรับ 10 คลาสดั้งเดิมและอาจให้ประสิทธิภาพการทำงาน OK สำหรับคลาสใหม่
  2. ฝึกอบรมเครือข่ายทั้งหมดในครั้งเดียว (โดยการเผยแพร่ข้อผิดพลาดของคลาสใหม่) ซึ่งอาจทำงานได้กับคลาสใหม่ (es) แต่คุณจะจบลงด้วยโซลูชันดั้งเดิมที่ไม่มีประสิทธิภาพสำหรับ 10 คลาส (เนื่องจากน้ำหนักจะเปลี่ยนสำหรับชั้นล่างและชั้นสุดท้าย จะไม่ได้รับการอัปเดตเพื่อให้ตรงกับการเปลี่ยนแปลงเหล่านั้น)

แม้ว่าคุณจะสามารถเข้าถึงข้อมูลการฝึกอบรมดั้งเดิมได้ แต่คุณสามารถเพิ่มคลาสใหม่ไปยังเครือข่ายเดิมและฝึกอบรมใหม่เพื่อรองรับ 11 คลาสนอกกรอบได้


2

สามารถทำได้อย่างง่ายดาย

สร้างโมเดลด้วยคลาส 10 อันดับแรกและบันทึกโมเดลเป็น base_model

โหลด base_model และกำหนดรูปแบบใหม่ที่ชื่อว่า new_model as-

new_model = Sequential()

จากนั้นเพิ่มเลเยอร์ของ base_model ให้กับ new_model -

# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
    new_model.add(layer)

ตอนนี้ทำให้เลเยอร์ของโมเดลใหม่ไม่สามารถฝึกได้เนื่องจากคุณไม่ต้องการให้โมเดลของคุณได้รับการฝึกฝนอีกครั้ง

# prevent the already trained layers from being trained again
for layer in new_model.layers:
    layer.trainable = False

ตอนนี้เมื่อคุณถ่ายโอนการเรียนรู้เมื่อคุณลบเลเยอร์สุดท้ายรูปแบบของการลืมเกี่ยวกับ 10 คลาสดังนั้นเราจึงต้องรักษาน้ำหนักของ base_model ให้เป็น new_model -

weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training) 

ตอนนี้เพิ่มเลเยอร์หนาแน่นที่ท้ายและเราจะฝึกเลเยอร์หนาแน่นนี้ในตัวอย่างนี้เท่านั้น

new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))

ตอนนี้ฝึกโมเดลและฉันหวังว่ามันจะให้ผลลัพธ์ที่ถูกต้องสำหรับคลาส 11 ทั้งหมด

เรียนรู้อย่างมีความสุข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.