மாற்றும் நெட்வொர்க்குகளை குறைப்பதற்கான ஜெடி நுட்பம் - கத்தரித்து
நீங்கள் மீண்டும் பொருட்களை கண்டறியும் பணியை முன். ஏற்றுக்கொள்ளக்கூடிய துல்லியத்துடன் செயல்பாட்டின் வேகம் முன்னுரிமை. நீங்கள் YOLOv3 கட்டமைப்பை எடுத்து அதற்கு மேலும் பயிற்சி அளிக்கிறீர்கள். துல்லியம்(mAp75) 0.95 ஐ விட அதிகமாக உள்ளது. ஆனால் ரன்ரேட் இன்னும் குறைவாகவே உள்ளது. தனம்.
இன்று நாம் அளவுப்படுத்தலை புறக்கணிப்போம். மற்றும் வெட்டு கீழ் நாம் பார்ப்போம் மாதிரி கத்தரித்து — துல்லியத்தை இழக்காமல் அனுமானத்தை விரைவுபடுத்த நெட்வொர்க்கின் தேவையற்ற பகுதிகளை ஒழுங்கமைத்தல். எங்கே, எவ்வளவு, எப்படி வெட்டுவது என்பது தெளிவாகிறது. இதை கைமுறையாக எப்படி செய்வது, எங்கு தானியக்கமாக்குவது என்று பார்ப்போம். முடிவில் கெராஸ் மீது ஒரு களஞ்சியம் உள்ளது.
அறிமுகம்
எனது முந்தைய பணியிடமான பெர்மில் உள்ள மேக்ரோஸ்கோப்பில், நான் ஒரு பழக்கத்தைப் பெற்றேன் - அல்காரிதம்களின் செயல்பாட்டு நேரத்தை எப்போதும் கண்காணிக்க. மற்றும் எப்போதும் போதுமான வடிகட்டி மூலம் பிணைய இயக்க நேரத்தை சரிபார்க்கவும். வழக்கமாக உற்பத்தியில் உள்ள அதிநவீன இந்த வடிப்பானைக் கடக்காது, இது என்னை ப்ரூனிங்கிற்கு இட்டுச் சென்றது.
கத்தரித்தல் என்பது பழைய தலைப்புகளில் விவாதிக்கப்பட்டது ஸ்டான்போர்ட் விரிவுரைகள் 2017 இல். பல்வேறு முனைகளை அகற்றுவதன் மூலம் துல்லியத்தை இழக்காமல் பயிற்சியளிக்கப்பட்ட நெட்வொர்க்கின் அளவைக் குறைப்பதே முக்கிய யோசனை. இது குளிர்ச்சியாகத் தெரிகிறது, ஆனால் அதன் பயன்பாட்டைப் பற்றி நான் அரிதாகவே கேட்கிறேன். அநேகமாக, போதுமான செயலாக்கங்கள் இல்லை, ரஷ்ய மொழி கட்டுரைகள் இல்லை, அல்லது எல்லோரும் அதை கத்தரித்தல் அறிவைக் கருதி அமைதியாக இருக்கிறார்கள்.
ஆனால் அதை பிரிப்போம்
உயிரியலில் ஒரு பார்வை
ஆழமான கற்றல் உயிரியலில் இருந்து வரும் கருத்துக்களைப் பார்க்கும்போது நான் அதை விரும்புகிறேன். அவை, பரிணாமத்தைப் போலவே, நம்பப்படலாம் (ReLU மிகவும் ஒத்ததாக உங்களுக்குத் தெரியுமா? மூளையில் நியூரான் செயல்பாட்டின் செயல்பாடு?)
மாதிரி கத்தரிப்பு செயல்முறை உயிரியலுக்கு நெருக்கமானது. இங்கே நெட்வொர்க்கின் பதிலை மூளையின் பிளாஸ்டிசிட்டியுடன் ஒப்பிடலாம். புத்தகத்தில் இரண்டு சுவாரஸ்யமான எடுத்துக்காட்டுகள் உள்ளன. நார்மன் டோய்ட்ஜ்:
ஒரு பாதியுடன் பிறந்த ஒரு பெண்ணின் மூளை காணாமல் போன பாதியின் செயல்பாடுகளைச் செய்ய தன்னைத்தானே மறுபிரசுரம் செய்துள்ளது.
பையன் பார்வைக்கு காரணமான மூளையின் பகுதியை சுட்டுக் கொன்றான். காலப்போக்கில், மூளையின் மற்ற பகுதிகள் இந்த செயல்பாடுகளை எடுத்துக் கொண்டன. (நாங்கள் மீண்டும் செய்ய முயற்சிக்கவில்லை)
அதேபோல், உங்கள் மாதிரியிலிருந்து சில பலவீனமான சுருள்களை நீங்கள் வெட்டலாம். கடைசி முயற்சியாக, மீதமுள்ள மூட்டைகள் வெட்டப்பட்டவற்றை மாற்ற உதவும்.
நீங்கள் பரிமாற்றக் கற்றலை விரும்புகிறீர்களா அல்லது புதிதாகக் கற்றுக்கொள்கிறீர்களா?
விருப்பம் எண் ஒன்று. நீங்கள் Yolov3 இல் பரிமாற்ற கற்றலைப் பயன்படுத்துகிறீர்கள். ரெடினா, மாஸ்க்-ஆர்சிஎன்என் அல்லது யு-நெட். ஆனால் பெரும்பாலான நேரங்களில் COCO போன்ற 80 ஆப்ஜெக்ட் வகுப்புகளை நாம் அங்கீகரிக்க வேண்டிய அவசியமில்லை. எனது நடைமுறையில், அனைத்தும் 1-2 வகுப்புகளுக்கு மட்டுமே. 80 வகுப்புகளுக்கான கட்டிடக்கலை இங்கு தேவையற்றது என்று ஒருவர் கருதலாம். கட்டிடக்கலை சிறியதாக இருக்க வேண்டும் என்று இது அறிவுறுத்துகிறது. மேலும், ஏற்கனவே உள்ள முன் பயிற்சி பெற்ற எடைகளை இழக்காமல் இதைச் செய்ய விரும்புகிறேன்.
விருப்பம் எண் இரண்டு. உங்களிடம் நிறைய தரவு மற்றும் கணினி ஆதாரங்கள் இருக்கலாம் அல்லது சூப்பர் தனிப்பயன் கட்டமைப்பு தேவைப்படலாம். பரவாயில்லை. ஆனால் நீங்கள் புதிதாக நெட்வொர்க்கை கற்றுக்கொள்கிறீர்கள். தரவுக் கட்டமைப்பைப் பார்த்து, அதிக சக்தி கொண்ட ஒரு கட்டிடக்கலையைத் தேர்ந்தெடுத்து, மீண்டும் பயிற்சியிலிருந்து இடைநிற்றலைத் தள்ளுவது வழக்கமான செயல்முறையாகும். நான் 0.6 இடைநிற்றல்களைப் பார்த்தேன், கார்ல்.
இரண்டு சந்தர்ப்பங்களிலும், பிணையத்தை குறைக்கலாம். உந்துதல் பெற்றது. இப்போது என்ன வகையான விருத்தசேதனம் கத்தரித்து என்பதைக் கண்டுபிடிப்போம்
பொது அல்காரிதம்
மூட்டைகளை அகற்றலாம் என்று முடிவு செய்தோம். இது மிகவும் எளிமையானதாக தோன்றுகிறது:
எந்தவொரு வளைவையும் அகற்றுவது நெட்வொர்க்கிற்கு மன அழுத்தத்தை ஏற்படுத்துகிறது, இது பொதுவாக பிழையில் சில அதிகரிப்புக்கு வழிவகுக்கிறது. ஒருபுறம், இந்த பிழையின் அதிகரிப்பு நாம் எவ்வளவு சரியாக வளைவுகளை அகற்றுகிறோம் என்பதற்கான குறிகாட்டியாகும் (எடுத்துக்காட்டாக, ஒரு பெரிய அதிகரிப்பு நாம் ஏதோ தவறு செய்கிறோம் என்பதைக் குறிக்கிறது). ஆனால் ஒரு சிறிய அதிகரிப்பு மிகவும் ஏற்றுக்கொள்ளத்தக்கது மற்றும் ஒரு சிறிய LR உடன் அடுத்தடுத்த ஒளி கூடுதல் பயிற்சி மூலம் அடிக்கடி அகற்றப்படுகிறது. கூடுதல் பயிற்சிப் படியைச் சேர்க்கவும்:
இப்போது நாம் கற்றல்<->கத்தரிப்பு வளையத்தை எப்போது நிறுத்த விரும்புகிறோம் என்பதைக் கண்டுபிடிக்க வேண்டும். நெட்வொர்க்கை ஒரு குறிப்பிட்ட அளவு மற்றும் வேகத்திற்கு குறைக்க வேண்டியிருக்கும் போது இங்கே கவர்ச்சியான விருப்பங்கள் இருக்கலாம் (உதாரணமாக, மொபைல் சாதனங்களுக்கு). இருப்பினும், பிழை ஏற்றுக்கொள்ளக்கூடியதை விட அதிகமாகும் வரை சுழற்சியைத் தொடர்வதே மிகவும் பொதுவான விருப்பமாகும். நிபந்தனையைச் சேர்க்கவும்:
எனவே, அல்காரிதம் தெளிவாகிறது. நீக்கப்பட்ட சுருள்களை எவ்வாறு தீர்மானிப்பது என்பதைக் கண்டுபிடிக்க இது உள்ளது.
நீக்கப்பட்ட தொகுப்புகளைத் தேடுங்கள்
நாம் சில வளைவுகளை அகற்ற வேண்டும். விரைந்து சென்று யாரையும் "சுடுவது" ஒரு மோசமான யோசனை, அது வேலை செய்யும் என்றாலும். ஆனால் உங்களிடம் ஒரு தலை இருப்பதால், அகற்றுவதற்கு "பலவீனமான" சுருள்களை நீங்கள் சிந்திக்கலாம் மற்றும் தேர்ந்தெடுக்க முயற்சி செய்யலாம். பல விருப்பங்கள் உள்ளன:
ஒவ்வொரு விருப்பத்திற்கும் வாழ்வதற்கான உரிமை மற்றும் அதன் சொந்த செயல்படுத்தல் அம்சங்கள் உள்ளன. இங்கே நாம் சிறிய L1-அளவை கொண்ட விருப்பத்தை கருதுகிறோம்
YOLov3 க்கான கைமுறை செயல்முறை
அசல் கட்டிடக்கலை எஞ்சிய தொகுதிகளைக் கொண்டுள்ளது. ஆனால் ஆழமான நெட்வொர்க்குகளுக்கு அவை எவ்வளவு குளிர்ச்சியாக இருந்தாலும், அவை நம்மை ஓரளவு தடுக்கும். சிரமம் என்னவென்றால், இந்த அடுக்குகளில் வெவ்வேறு குறியீடுகளுடன் சமரசங்களை நீக்க முடியாது:
எனவே, சமரசங்களை சுதந்திரமாக நீக்கக்கூடிய அடுக்குகளைத் தேர்ந்தெடுப்போம்:
இப்போது ஒரு வேலை சுழற்சியை உருவாக்குவோம்:
செயல்படுத்தல்களைப் பதிவேற்றுகிறது
எவ்வளவு வெட்ட வேண்டும் என்பதைக் கண்டறிதல்
வெட்டி எடு
LR=10e-1 உடன் 4 சகாப்தங்களைக் கற்றல்
சோதனை
ஒரு குறிப்பிட்ட கட்டத்தில் நாம் எவ்வளவு பகுதியை அகற்ற முடியும் என்பதை மதிப்பிடுவதற்கு சுருள்களை இறக்குவது பயனுள்ளதாக இருக்கும். இறக்குதல் எடுத்துக்காட்டுகள்:
ஏறக்குறைய எல்லா இடங்களிலும் 5% சுருள்கள் மிகக் குறைந்த L1-நெறியைக் கொண்டிருப்பதைக் காண்கிறோம், அவற்றை அகற்றலாம். ஒவ்வொரு அடியிலும், இந்த இறக்குதல் மீண்டும் மீண்டும் செய்யப்பட்டது மற்றும் எந்த அடுக்குகள் மற்றும் எத்தனை வெட்டப்படலாம் என்று மதிப்பீடு செய்யப்பட்டது.
முழு செயல்முறையும் 4 படிகளில் முடிக்கப்பட்டது (RTX 2060 Super க்கான எண்கள் இங்கே மற்றும் எல்லா இடங்களிலும்):
படி
mAp75
அளவுருக்களின் எண்ணிக்கை, மில்லியன்
நெட்வொர்க் அளவு, எம்பி
ஆரம்பத்திலிருந்து, %
இயக்க நேரம், எம்.எஸ்
விருத்தசேதனம் நிலை
0
0.9656
60
241
100
180
-
1
0.9622
55
218
91
175
மொத்தத்தில் 5%
2
0.9625
50
197
83
168
மொத்தத்தில் 5%
3
0.9633
39
155
64
155
15+ சுருள்கள் கொண்ட அடுக்குகளுக்கு 400%
4
0.9555
31
124
51
146
10+ சுருள்கள் கொண்ட அடுக்குகளுக்கு 100%
ஒரு நேர்மறையான விளைவு படி 2 இல் சேர்க்கப்பட்டது - தொகுதி அளவு 4 நினைவகத்தில் பொருந்துகிறது, இது கூடுதல் பயிற்சியின் செயல்முறையை பெரிதும் துரிதப்படுத்தியது.
படி 4 இல், செயல்முறை நிறுத்தப்பட்டது நீண்ட கால கூடுதல் பயிற்சி கூட mAp75 ஐ பழைய மதிப்புகளுக்கு உயர்த்தவில்லை.
இதன் விளைவாக, அனுமானத்தை விரைவுபடுத்த முடிந்தது 15%, அளவு குறைக்க 35% மற்றும் சரியாக இழக்கவில்லை.
எளிமையான கட்டமைப்புகளுக்கான ஆட்டோமேஷன்
எளிமையான பிணைய கட்டமைப்புகளுக்கு (நிபந்தனை சேர்க்கை, இணைக்கப்பட்ட மற்றும் எஞ்சிய தொகுதிகள் இல்லாமல்), அனைத்து கன்வல்யூஷனல் அடுக்குகளையும் செயலாக்குவதில் கவனம் செலுத்துவது மற்றும் சுருள்களை வெட்டுவதற்கான செயல்முறையை தானியங்குபடுத்துவது மிகவும் சாத்தியமாகும்.
நான் இந்த விருப்பத்தை செயல்படுத்தினேன் இங்கே.
இது எளிதானது: உங்களுக்கு இழப்பு செயல்பாடு, மேம்படுத்தி மற்றும் தொகுதி ஜெனரேட்டர்கள் மட்டுமே தேவை:
import pruning
from keras.optimizers import Adam
from keras.utils import Sequence
train_batch_generator = BatchGenerator...
score_batch_generator = BatchGenerator...
opt = Adam(lr=1e-4)
pruner = pruning.Pruner("config.json", "categorical_crossentropy", opt)
pruner.prune(train_batch, valid_batch)
தேவைப்பட்டால், நீங்கள் கட்டமைப்பு அளவுருக்களை மாற்றலாம்:
{
"input_model_path": "model.h5",
"output_model_path": "model_pruned.h5",
"finetuning_epochs": 10, # the number of epochs for train between pruning steps
"stop_loss": 0.1, # loss for stopping process
"pruning_percent_step": 0.05, # part of convs for delete on every pruning step
"pruning_standart_deviation_part": 0.2 # shift for limit pruning part
}
கூடுதலாக, நிலையான விலகலின் அடிப்படையில் ஒரு வரம்பு செயல்படுத்தப்படுகிறது. ஏற்கனவே "போதுமான" L1 அளவீடுகளுடன் வளைவுகளைத் தவிர்த்து, அகற்றப்பட்ட பகுதியைக் கட்டுப்படுத்துவதே குறிக்கோள்:
எனவே, வலதுபுறத்தைப் போன்ற விநியோகங்களிலிருந்து பலவீனமான சுருட்டுகளை மட்டுமே அகற்ற நாங்கள் உங்களை அனுமதிக்கிறோம் மற்றும் இடதுபுறத்தில் உள்ளதைப் போன்ற விநியோகங்களிலிருந்து அகற்றப்படுவதைப் பாதிக்காது:
விநியோகம் இயல்பு நிலைக்கு வரும்போது, கத்தரித்து_நிலை_விலகல்_பகுதி குணகத்தை இதிலிருந்து தேர்ந்தெடுக்கலாம்:
2 சிக்மாவின் அனுமானத்தை நான் பரிந்துரைக்கிறேன். அல்லது <1.0 மதிப்பை விட்டுவிட்டு இந்த அம்சத்தை நீங்கள் புறக்கணிக்கலாம்.
வெளியீடு என்பது நெட்வொர்க் அளவு, இழப்பு மற்றும் பிணைய இயக்க நேரத்தின் வரைபடம் ஆகும், இது 1.0 க்கு இயல்பாக்கப்பட்டது. எடுத்துக்காட்டாக, இங்கே நெட்வொர்க் அளவு தரத்தை இழக்காமல் கிட்டத்தட்ட 2 மடங்கு குறைக்கப்பட்டது (100k எடைகள் கொண்ட சிறிய கன்வல்யூஷனல் நெட்வொர்க்):
இயங்கும் வேகம் சாதாரண ஏற்ற இறக்கங்களுக்கு உட்பட்டது மற்றும் கிட்டத்தட்ட மாறாமல் உள்ளது. இதற்கு ஒரு விளக்கம் உள்ளது:
வளைவுகளின் எண்ணிக்கை வசதியானது (32, 64, 128) என்பதிலிருந்து வீடியோ அட்டைகளுக்கு மிகவும் வசதியாக இல்லை - 27, 51, முதலியன. நான் இங்கே தவறாக இருக்கலாம், ஆனால் பெரும்பாலும் அது ஒரு விளைவை ஏற்படுத்தும்.
கட்டிடக்கலை பரந்ததாக இல்லை, ஆனால் நிலையானது. அகலத்தை குறைப்பதன் மூலம், ஆழத்தை நாம் பாதிக்க மாட்டோம். இதனால், நாங்கள் சுமையை குறைக்கிறோம், ஆனால் வேகத்தை மாற்ற வேண்டாம்.
எனவே, இயக்கத்தின் போது CUDA சுமை 20-30% குறைவதில் முன்னேற்றம் வெளிப்படுத்தப்பட்டது, ஆனால் இயக்க நேரத்தில் குறைப்பில் இல்லை
முடிவுகளை
பிரதிபலிப்போம். YOLOv2 (உங்கள் கைகளால் வேலை செய்ய வேண்டியிருக்கும் போது) மற்றும் எளிமையான கட்டமைப்புகள் கொண்ட நெட்வொர்க்குகளுக்கு - கத்தரிப்பதற்காக 3 விருப்பங்களை நாங்கள் கருதினோம். இரண்டு சந்தர்ப்பங்களிலும் துல்லியத்தை இழக்காமல் பிணைய அளவு குறைப்பு மற்றும் வேகத்தை அடைய முடியும் என்பதைக் காணலாம். முடிவுகள்:
அளவைக் குறைத்தல்
முடுக்கம் ஓட்டம்
CUDA சுமை குறைகிறது
இதன் விளைவாக, சுற்றுச்சூழல் நட்பு (கம்ப்யூட்டிங் வளங்களின் எதிர்கால பயன்பாட்டை நாங்கள் மேம்படுத்துகிறோம். எங்கோ ஒருவர் மகிழ்ச்சியாக இருக்கிறார் கிரேட்டா துன்பெர்க்)
பின் இணைப்பு
கத்தரிக்கும் படிக்குப் பிறகு, நீங்கள் அளவைச் சேர்க்கலாம் (எடுத்துக்காட்டாக, TensorRT உடன்)